Я делаю логин Activity
, который в основном имеет EditText
и два Buttons
. Это выглядит следующим образом:Редактор TextWatcher EditText
EditText
имеет TextWatcher
, которая проверяет пользователя с AsyncTask
, который попадает в WebService.
Код:
public class Login extends Activity {
private EditText mUserNameET;
private Drawable mCorrect;
private Drawable mIncorrect;
private ProgressBar mProgressBar;
private MyApp mApp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
mApp = (MyApp) getApplication();
mUserNameET = (EditText) findViewById(R.id.user_name_et);
mUserNameET.addTextChangedListener(new LoginValidator());
mCorrect = getResources().getDrawable(R.drawable.correct);
mIncorrect = getResources().getDrawable(R.drawable.incorrect);
mProgressBar = new ProgressBar(this);
}
private class LoginValidator implements TextWatcher {
private ValidateUserAsyncTask validator = new ValidateUserAsyncTask();
@Override
public void afterTextChanged(Editable s) {
String value = s.toString();
if (value.length() == 0)
return;
/* If it's running, cancel it. */
/* Issue #2 */
if (AsyncTask.Status.RUNNING == validator.getStatus()) {
validator.cancel(true);
validator = new ValidateUserAsyncTask();
} else if (AsyncTask.Status.FINISHED == validator.getStatus()) {
validator = new ValidateUserAsyncTask();
}
validator.execute(value);
/* Issue #1 */
mUserNameET.setCompoundDrawables(null, null, mProgressBar.getProgressDrawable(), null);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
}
}
class ValidateUserAsyncTask extends AsyncTask<String, Void, Boolean> {
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
if (result) {
mUserNameET.setCompoundDrawablesWithIntrinsicBounds(null, null, mCorrect, null);
} else {
mUserNameET.setCompoundDrawablesWithIntrinsicBounds(null, null, mIncorrect, null);
}
}
@Override
protected Boolean doInBackground(String... params) {
return mApp.validateUser(params[0]);
}
}
}
Мои вопросы:
Хотя AsyncTask
работает Я хочу, чтобы показать ProgressBar внутри EditText
. Я пытался сделать это с помощью:
mUserNameET.setCompoundDrawables(null, null, mProgressBar.getProgressDrawable(), null);
, но он не работает.
И я также немного обеспокоен созданием новых экземпляров AsyncTask
. Я утечка памяти?
Как вы получаете 'EditText 'с кнопкой' x', чтобы стереть текст? – JuiCe