Как заставить диалоговое окно оставаться до тех пор, пока оно явно не будет закрыто?

#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();
            }
        }
    });
  

Больше кода здесь.