3

私のアプリケーションでは、パスワードを受け入れるダイアログ ボックスを作成しました。ダイアログには、メッセージ、EditText、および 2 つのボタン (+ve と -ve) が表示されます。ユーザーが +ve ボタンをクリックすると、EditText に入力されたパスワードが有効かどうかを確認しています。有効でない場合は、ユーザーにパスワードの再入力を促すダイアログ ボックスのメッセージを変更する必要があります。

パスワードが有効な場合、期待どおりに機能しますが、無効であり、メッセージを更新する代わりに、単にダイアログを閉じます。

onPrepareDialog()をオーバーライドして解決しようとしましたが、うまくいきません。

これが私のコードです:

protected Dialog onCreateDialog(int viewId){
    AlertDialog dialog = null;
    final AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setMessage("Enter Password To Continue");
            final EditText passwordField = new EditText(getApplicationContext());
            builder.setView(passwordField);
            builder.setPositiveButton("SUBMIT", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {

                    if(passwordField.getText().toString().equals("password")){
                        Intent intent = new Intent(MyFirstActivity.this, NextActivity.class);
                        finish();
                        startActivity(intent);
                    }else{
                            //Here I need to update the message
                        builder.setMessage("SORRY!!! Wrong Password Entered.\n Re-Enter Correct Password Again ");
                    }                       
                }
            });
            builder.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });
            dialog =  builder.create();
    }
    return dialog;
}
4

2 に答える 2

2

ここには2つの問題があると思います。

  1. 私が正しく思い出せば、AlertDialog の PositiveButton のデフォルトの動作はダイアログを閉じます。パスワードが間違っているとあなたが閉じているのはそのためだと思います。に切り替えると思います

    builder.setNeutralButton(...);
    

    押してもダイアログは閉じません。

  2. ダイアログ自体ではなく、ビルダーのメッセージを変更しています。ダイアログが作成されて表示されると、ビルダーがダイアログの外観を動的に変更するとは思わない。

    dialog.setMessage("WRONG PASSWORD");
    

あなたのためにそれを変えると思います。そうでない場合は、TextView を作成してダイアログに追加する必要があります。参照をbuilder.setView(mTxt);呼び出すsetText();と、画面上のテキストが変更されます。

どちらよりも優れた解決策は、 Toastポップアップであると思います。ユーザーはパスワードを入力して送信を押しただけなので、画面を見ていると推測できると思います。ログインページを持つ他の多くのアプリケーションは、Toast メッセージを使用して、パスワードが間違っているかどうかをユーザーに通知するため、ユーザーや何かを混乱させることはないと思います。これは一般的な設計パターンです。

編集:

AlertDialog クラスには間違いなく setMessage() メソッドがあります。こちらのドキュメントを参照してください。ドキュメントページの下部にあるため、リンクを正しくクリックしても上部にスクロールしません。しかし、それはそこにあります。私にとっては上から3番目です。setInverseBackgroundForced~の間setTitle

編集2:

少し前にやろうとしていることに似たものを実装しました。押されたときにダイアログを非表示にしないようにするために、ダイアログボタンで独自のカスタムリスナーオブジェクトを使用する必要がありました。

ダイアログを作成して表示する方法は次のとおりです。

  AlertDialog.Builder builder = new AlertDialog.Builder(YourActivity.this);
  builder.setCancelable(false)
  .setMessage("Please Enter Something")

  .setPositiveButton("Enter", new DialogInterface.OnClickListener() {
       public void onClick(DialogInterface dialog, int id) {
        //All of the fun happens inside the CustomListener now.
        //I had to move it to enable data validation.
        }
   });
   AlertDialog alertDialog = builder.create();
   alertDialog.show();
   Button theButton = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
   theButton.setOnClickListener(new CustomListener(alertDialog));

次に、Activity 内に CustomListener という Inner クラスを次のように作成しました。

class CustomListener implements View.OnClickListener {
    private final Dialog dialog;
    public CustomListener(Dialog dialog) {
        this.dialog = dialog;
    }
    @Override
    public void onClick(View v) {


        if(passwordField.getText().toString().equals("password")){
            //Password is correct.


        } else { //Password is incorrect.
            ((AlertDialog)dialog).setMessage("WRONG");
        }
    }
}

この方法でリスナーを設定すると、ボタンを押してもダイアログが自動的に閉じません。

于 2012-06-20T13:22:38.447 に答える
0

ティムによって提供された答えは正しいですが、私はまだ私の答えを投稿します。将来、もっと別の答えが欲しい人を助けるためです。

長い検索の後、 onShow()メソッドをオーバーライドすることでこれを別の方法で解決しました。

@Override
protected Dialog onCreateDialog(int viewId){
    AlertDialog dialog;
    final AlertDialog.Builder builder = new AlertDialog.Builder(this);

            builder.setMessage("Enter Password To Continue");
            final TextView message = new TextView(getApplicationContext());
            message.setText("Enter Password To Continue");
            builder.setView(message);

            final EditText passwordField = new EditText(getApplicationContext());
            builder.setView(passwordField);
            builder.setPositiveButton("SUBMIT", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                        //Do Nothing
                                    }
            });
            builder.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });
            dialog =  builder.create();
            dialog.setOnShowListener(new OnShowListener() {

                @Override
                public void onShow(final DialogInterface dialog) {
                    // TODO Auto-generated method stub
                    Button b = ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE);
                    b.setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View v) {
                                       if(passwordField.getText().toString().equals("password")){
                                Intent intent = new Intent(PuzzleHome.this, PuzzleMaker.class);
                                startActivity(intent);
                            }else{
                                ((AlertDialog) dialog).setMessage("SORRY!!! Wrong Password Entered.\n Re-Enter Correct Password Again");
                            }
                        }
                    });
                }
            });
    }
    return dialog;
}
于 2012-06-21T06:01:56.467 に答える