Как я могу получить результаты из AlertDialog?

Я использую AlertDialog.Builder для отображения диалогового окна, предлагающего пользователю ввести пароль, затем я хочу сохранить этот пароль в настройках, однако я не могу понять, как получить результат из метода ввода диалогового окна предупреждения.

Вот, по сути, что я хотел бы сделать:

    String result;
    AlertDialog.Builder b = new AlertDialog.Builder(this);
    b.setTitle("Please enter a password");
    final EditText input = new EditText(this);
    b.setView(input);
    b.setPositiveButton("OK", new DialogInterface.OnClickListener()
    {
        @Override
        public void onClick(DialogInterface dialog, int whichButton)
        {
           //I get a compile error here, it wants result to be final.
           result = input.getText().toString();
        }
    });
    b.setNegativeButton("CANCEL", null);
    b.create().show();

Тем не менее, я готов сделать что-то вроде showDialog(int);, затем использовать метод onCreateDialog(int) и каким-то образом установить результат и получить его каким-то другим методом, но я понятия не имею, как выполнить последнюю часть.


person finiteloop    schedule 10.05.2011    source источник
comment
См. также Обратный вызов на AlertDialog   -  person Suragch    schedule 06.06.2019


Ответы (5)


Упрощенный пример:

public interface TextListener {
    void onPositiveResult(CharSequence text);
}

public static AlertDialog getTextDialog(Context ctx,
        final TextListener listener) {
    View view = LayoutInflater.from(ctx).inflate(R.layout.dialog, null);
    final TextView tv = (TextView) view.findViewById(R.id.tv);
    AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
    builder.setView(view);
    //
    builder.setPositiveButton(android.R.string.ok, new OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            listener.onPositiveResult(tv.getText());
        }
    });
    builder.setNegativeButton(android.R.string.cancel, null);
    return builder.create();
}

-- РЕДАКТИРОВАТЬ -- Или попробуйте этот код:

 public class Main extends Activity {
    private Button btn;
    private String result;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        btn = (Button) findViewById(R.id.button1);
        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                showDialog(0);
            }
        });
    }

    @Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {
        case 0:
            final EditText input = new EditText(this);

            return new AlertDialog.Builder(this)
            .setIcon(R.drawable.icon)
            .setTitle("Please enter a password")
            .setView(input)
            .setPositiveButton("OK", new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int whichButton) {
                    Toast.makeText(getBaseContext(), input.getText().toString(), Toast.LENGTH_SHORT).show();
                }
            })
            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int whichButton) {
                    Toast.makeText(getBaseContext(), "Cancel clicked!", Toast.LENGTH_SHORT).show();
                }
            }).create();
        }

        return null;
    }
}
person evilone    schedule 10.05.2011
comment
Извините, я не совсем понимаю, что здесь происходит, или как я буду использовать это, чтобы достичь того, чего я пытаюсь достичь. - person finiteloop; 10.05.2011
comment
evilone предлагает вам использовать шаблон Observer и создать свой собственный слушатель (TextListener). Ваша активность, в которой содержится этот AlertDialog, может затем реализовать TextListener, который вызовет onPositiveResult(CharSequence) вне AlertDialog, и он передаст результат, который вы ищете, на основе вашего вопроса. Затем вы можете действовать на свой результат, как вы хотите. - person nicholas.hauschild; 10.05.2011

Вы можете ознакомиться с руководством по Dialog на сайте developer.android.com.

Сначала создайте диалоговый класс:

Добавление списка

Затем добавьте прослушиватель в этот класс, чтобы передать результат активности.

Передача событий обратно на узел диалога

person fred.yu    schedule 26.11.2014

Слабое, но быстрое решение:

Объявите метод уровня активности:

TextView lblDiaDestination;

public void dialogReturn(String msg){
   lblDiaDestination.setText(msg);
}

и вызовите его из прослушивателя нажатия положительной кнопки:

alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
        dialogReturn(   input.getText().toString().trim()   );
    });

Вы можете изменить значение lblDiaDestination непосредственно перед alert.show():

lblDiaDestination = myTextView;
alert.show():
person Elleboro    schedule 24.08.2013

Переменный результат, сделайте его переменной-членом вместо локальной переменной. Делая «результат» в качестве переменной-члена, он доступен во всей активности (родительский класс, который расширяет активность).

person sat    schedule 10.05.2011
comment
+1 за правильный ответ. Я выбрал @Femi's, потому что он был более надежным. Спасибо! - person finiteloop; 10.05.2011

Это довольно долго. Я надеюсь, что мой вклад может быть полезен для новичков. Я думаю, что ключом к ответу на вопрос является объявление переменной result как члена действия (давайте назовем его YourActivity). Затем внутри метода onClick используйте YourActivity.this.result для доступа к этой переменной.

Я редактирую коды @finiteloop, как показано ниже:

public class YourActivity extends Activity {
    private String result;
    // other activity stuff

    void showDialog(){
        AlertDialog.Builder b = new AlertDialog.Builder(this);
        b.setTitle("Please enter a password");
        final EditText input = new EditText(this);
        b.setView(input);
        b.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int whichButton) {        
               YourActivity.this.result = input.getText().toString();
            }
        });
        b.setNegativeButton("CANCEL", null);
        b.create().show();
    }
}
person hoang21    schedule 03.02.2015