2011-05-10 105 views
17

我正在使用AlertDialog.Builder来显示一个对话框来提示用户输入密码,然后我想将该密码保存在首选项中,但是我无法弄清楚如何从警报对话框的输入中获取结果方法。如何从AlertDialog获取结果?

这里基本上是我想什么能够做到:

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)方法并以某种方式设置的结果,在一些接受它其他方法,但我不知道如何去做最后一部分。

回答

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

简单的例子:

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

对不起,我不太明白是怎么回事,或者我怎么会用这个来实现我想要实现的。 – finiteloop 2011-05-10 17:09:26

+0

@segfault,编辑我的回答 – evilone 2011-05-10 17:28:09

+2

evilone建议您使用Observer模式并创建您自己的侦听器(TextListener)。然后,包含此AlertDialog的活动可以实现TextListener,它将调用AlertDialog外部的onPositiveResult(CharSequence),并且它会根据您的问题传递您正在查找的结果。然后,您可以根据自己的意愿采取行动。 – 2011-05-10 17:32:00

1

可变结果,使它成为一个成员变量,而不是局部变量。通过使“结果”作为成员变量是在整个活动访问(其延伸活动的父类)

+0

+1正确的答案。我选择了@菲米,因为它更强大。谢谢! – finiteloop 2011-05-10 19:07:55

1

弱但迅速解决:

声明一个活动水平的方法:

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(): 
0

这挺长的。我希望我的贡献对新来的人有用。 我认为回答问题的关键是声明变量结果作为活动的成员(我们称之为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(); 
    } 
}