web-dev-qa-db-ja.com

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)メソッドを使用して結果を設定し、他の方法でそれを受け取ることを受け入れますが、どうすればよいかわかりません最後の部分。

24
finiteloop
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();
    }
}
25
Femi

簡略化した例:

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

あなたはdeveloper.Android.comの Dialog チュートリアルに従うことができます。

最初にダイアログクラスを作成します。

リストの追加

次に、このクラスにリスナーを追加して、結果をアクティビティに渡します。

イベントをダイアログのホストに渡す

2
fred.yu

弱いが迅速なソリューション:

アクティビティレベルメソッドを宣言します。

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():
2
Elleboro

変数の結果。ローカル変数ではなく、メンバー変数にします。 「結果」をメンバー変数として作成することにより、アクティビティ全体でアクセスできます。(アクティビティを拡張する親クラス)

1
sat

これはかなり長いです。私の貢献が新参者に役立つことを願っています。質問に答える鍵は、変数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();
    }
}
0
hoang21