如何从AlertDialog中获取结果?

25

我正在使用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)方法设置结果并在某些其他方法中接收它,但我不知道如何完成最后一部分。


请参阅Callback on AlertDialog - Suragch
6个回答

26
public class MyActivity extends Activity {
    private String result;

    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) {
                result = input.getText().toString();
            }
        });
        b.setNegativeButton("CANCEL", null);
        b.show();
    }
}

4

简单示例:

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;
    }
}

对不起,我不太理解这里发生了什么,也不知道如何使用它来实现我想要达到的目标。 - finiteloop
2
evilone建议您使用观察者模式并创建自己的监听器(TextListener)。您的Activity将容纳此AlertDialog,可以实现TextListener接口,并在AlertDialog外部调用onPositiveResult(CharSequence),然后根据您的问题传递所需的结果。然后,您可以按您的意愿处理结果。 - nicholas.hauschild

3

2

较弱但快速的解决方案:

声明一个Activity级别的方法:

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

在 alert.show() 之前,您可以更改 lblDiaDestination 的值:

lblDiaDestination = myTextView;
alert.show():

1

将变量“result”改为成员变量,而不是局部变量。通过将“result”作为成员变量,它可以在整个活动(扩展活动的父类)中访问。


我选择了@Femi的,因为它更加健壮。谢谢! - finiteloop

0
这段内容比较长。我希望我的贡献能对新手有所帮助。 我认为回答这个问题的关键是将变量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();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接