#android
#Android
Вопрос:
Я работаю над сценарием аутентификации пользователя.Я изложил суть кода ниже.
Я вызываю функцию
showDialog(DIALOG_LOGIN);
из функции onCreate () моей активности.Моя проблема в том, что диалоговое окно закрывается само по себе после выполнения кода внутри любого нажатия кнопки.Но я хочу, чтобы диалоговое окно оставалось до тех пор, пока я не упомяну, что оно должно быть отклонено.Например: если проверка подлинности завершается неудачей, я хочу, чтобы диалоговое окно не было удалено.Как это можно сделать?
protected Dialog onCreateDialog(int id) {
switch (id) {
case DIALOG_LOGIN:
// Inflating the View from the xml
factory = LayoutInflater.from(this);
loginView = factory.inflate(R.layout.alert_dialog_text_entry, null);
return new AlertDialog.Builder(this)
.setTitle(R.string.alert_dialog_login)
.setView(loginView)
.setPositiveButton(R.string.dialog_ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
Context context = getApplicationContext();
SharedPreferences prefs = PreferenceManager
.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = prefs
.edit();
EditText username = (EditText) loginView
.findViewById(R.id.username_edit);
EditText password = (EditText) loginView
.findViewById(R.id.password_edit);
//Authenticating UserName and Password.
String params [] ={username.getText().toString(),
password.getText().toString()};
new AsyncAuthneticationTask().execute(params);
}
})
.setNegativeButton(R.string.dialog_cancel,
new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
}
}).create();
}
return null;
}
Функция onPostExecute асинхронной задачи:
@Override
protected void onPostExecute(String response){
Toast toast;
if(response.contains("Invalid")){
toast=Toast.makeText(Login.this,response, Toast.LENGTH_LONG);
toast.show();
}
else{
toast=Toast.makeText(Login.this, getString(R.string.authentication_success_msg), Toast.LENGTH_LONG);
toast.show();
dismissDialog(DIALOG_LOGIN);
}
}
Ответ №1:
Не могли бы вы создать цикл While, содержащий все диалоговое окно целиком:
boolean success = false;
...
case DIALOG_LOGIN:
do
{
...
.setPositiveButton(R.string.dialog_ok,new DialogInterface.OnClickListener()
{
...
success=true;
}
...
}while (!success)
Комментарии:
1. Странная конструкция для того, чтобы цикл do / while постоянно устанавливал OnClickListener . : o
2. ха-ха, да, но если бы это сработало, это казалось бы проще, чем писать пользовательский интерфейс / диалоговое окно. также, насколько я понимаю, это не должно быть проблемой для слушателей, поскольку они выбрасываются, когда диалоговое окно исчезает. я могу быть совершенно неправ, это как раз то, что я бы попробовал в первую очередь.
3. Нет, я думаю, что вы правы в этой теме, но я тоже не уверен: o
Ответ №2:
Ну, это поведение класса Dialog по умолчанию для Android. Если вы хотите явно заставить его остаться, я думаю, вам нужно создать свое собственное диалоговое окно, для которого вы можете сами определить поведение. Для примеров просто погуглите это.
Комментарии:
1. Никогда не думал, что мне нужно создавать пользовательский класс диалога для этого. Разве кто-нибудь еще не сталкивался с такой необходимостью.
2. Ну, на самом деле, если вы посмотрите на свою собственную правку, вы сами дали ответ, если я не ошибаюсь. Еще раз прочитайте ответ пользователя 590849 и посмотрите на метод onPostExecute. Он будет выполняться через код в предложении else, который, в свою очередь, закрывает диалоговое окно. Я не знаю, хотите ли вы, чтобы оно вело себя именно так, но это может привести к этому.
3. Нет. Я пробовал разные способы там. Диалоговое окно будет закрыто, как только выполнение кода закончится.
4. Что ж, в ответ на мой первоначальный ответ взгляните на helloandroid.com/tutorials / … . Здесь показано, как вы можете создать свой собственный диалог, в котором вы можете указать поведение. На самом деле это так же просто, как добавление другого действия (поскольку это просто добавление другого действия).
5. Ну, я ошибся, а не другое действие. Но, тем не менее, довольно простое
Ответ №3:
я не понимаю, почему вы звоните
dismissDialog(DIALOG_LOGIN);
ShowDialog(DIALOG_LOGIN);
одно за другим? я имею в виду, что вам не нужно этого делать. Просто ничего не делайте, когда пользователь нажимает отрицательную кнопку. Или просто закройте диалоговое окно.
Также аутентификация, похоже, выполняется в новом AsyncAuthneticationTask().execute(параметры); поток. Вы по ошибке закрываете диалоговое окно вызовом dismiss () в методе onpostexecute, который там находится?
Комментарии:
1. Я думаю, что это была попытка, предпринятая роджерстоуном для решения рассматриваемой проблемы.
Ответ №4:
избегайте .setPositiveButton и используйте пользовательский интерфейс instad, можете ли вы закрыть диалоговое окно, когда захотите
Образец кода без пользовательских элементов управления
LayoutInflater mInflater = LayoutInflater.from(tab3.this);
AlertDialog.Builder builder = new AlertDialog.Builder(tab3.this);
builder.setTitle(params[4]);
View convertView = mInflater.inflate(R.xml.dialog_addr, null);
final EditText et_city = (EditText) convertView.findViewById(R.id.dialog_et_1);
final EditText et_street = (EditText) convertView.findViewById(R.id.dialog_et_2);
final EditText et_number = (EditText) convertView.findViewById(R.id.dialog_et_3);
((TextView)convertView.findViewById(R.id.dialog_tv_1)).setText(R.string.dialog_city);
((TextView)convertView.findViewById(R.id.dialog_tv_2)).setText(R.string.dialog_street);
((TextView)convertView.findViewById(R.id.dialog_tv_3)).setText(R.string.dialog_number);
builder.setView(convertView);
final AlertDialog alert = builder.create();
et_city.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
alert.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
}
});
alert.show();
Ответ №5:
Интересно, подойдет ли пользовательский диалог:
// UPDATE BUTTON HANDLER
final Button buttonUpdate= (Button)d.findViewById(R.id.ButtonPasswordUpdate);
buttonUpdate.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String entryFirst= editTextPasswordFirst.getText().toString();
String entrySecond= editTextPasswordSecond.getText().toString();
if (entryFirst.equals(entrySecond)) { // do NOT use == with string values
if (entryFirst.length() != lengthPassword) { // invalid key length
editTextPasswordFirst.setText("Invalid Key Length of "
new Integer(entryFirst.length()).toString());
editTextPasswordSecond.setText("");
editTextPasswordFirst.selectAll();
editTextPasswordFirst.requestFocus();
}
else {
editTextPassword.setText(entryFirst);
// *** Clear Key Fields ***
editTextPasswordFirst.setText("");
editTextPasswordSecond.setText("");
d.dismiss();
}
}
else { // entries do not match
editTextPasswordFirst.setText("Entries did not match!");
editTextPasswordSecond.setText("");
editTextPasswordFirst.selectAll();
editTextPasswordFirst.requestFocus();
}
}
});