0

リストビューによって作成されたアイテムのリストがあります。リストの項目の 1 つを長押しして警告ダイアログを開き、そのダイアログ ボックスの yes または no キーに応じて、グローバル変数を設定したいと思います。私が使用しているコードは「MyActivity.java」内にあり、次のようになります。

ListView lv = getListView();
lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(AdapterView<?> av, View v, int pos, final long id) {

        final AlertDialog.Builder b = new AlertDialog.Builder(MyActivity.this);
        b.setIcon(android.R.drawable.ic_dialog_alert);
        b.setMessage("Are you sure?");
        b.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                    yesOrNo = 1;
                }
        });
        b.setNegativeButton("No", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                    yesOrNo = 0;
                }
        });

        b.show();

        if (yesOrNo == 1) {
            DO SOMETHING;   
        }
        return true;
    }
});

ただし、「はい」または「いいえ」を押しても、グローバル変数「yesOrNo」は変化しません。誰かがコードの何が問題なのか教えてもらえますか?

助けてくれてありがとう。

4

5 に答える 5

2

AlertDialog選択を待ちません。メソッドを呼び出すとshow()、次の 2 行がすぐに実行されます。

if (yesOrNo == 1) {
        DO SOMETHING;   
}

したがって、yesOrNo変数の値はその初期値になります。

解決策:

positiveButton のメソッド内と、negativeButton のメソッドdoSomething(0)内で呼び出すことができます。onClick()doSomething(1)onClick()

于 2011-07-20T14:51:21.213 に答える
0

次のテストは適切な場所ではありません。

if (yesOrNo == 1) {
    DO SOMETHING;   
}

ユーザーがボタンをクリックしたときではなく、ダイアログが作成されたときに評価されます。ですから、その時yesOrNoはまだです、そして私たちは決して。falseDO SEOMTHING

DO SOMETHINGb.setPositiveButton()onClick()ハンドラーに配置する必要があります。

于 2011-07-20T14:53:25.863 に答える
0

PositiveButton と NegativeButton で 2 つの別々の関数を呼び出し、必要なコードを記述します。

サンプル:

public void onListItemClick(ListView parent, View view, int position, long id) {

         b = new AlertDialog.Builder(this);

        b.setMessage("Are you sure?");
        b.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {

              yes();
                }
        });
        b.setNegativeButton("No", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {

                  no();
                }
        });
        b.show();
    Toast.makeText(this, "no", Toast.LENGTH_LONG).show();
    }

   public void yes()
   {
       Toast.makeText(this, "yes", Toast.LENGTH_LONG).show();
   }
   public void no()
   {
       Toast.makeText(this, "no", Toast.LENGTH_LONG).show();
   }
于 2011-07-20T15:23:47.883 に答える
0

yesOrNo が変更されています。しかし、キャッチできませんでした。AlertDialog は非同期であるため、クリックを待機しません。スコープの残りの部分を実行します。変更を確認したい場合は、ダイアログをクリックして値を確認します。ボタン .then が表示されます

于 2011-07-20T14:51:30.170 に答える
0

b.show() を呼び出した直後に yesOrNo の値を確認することはできません。ダイアログが表示されたからといって、ボタンがクリックされたわけではありません。DO SOMETHING内で実行するOnClickListenerか、 内からメソッドを呼び出す必要がありますOnClickListener

于 2011-07-20T14:51:51.040 に答える