1

このような単純な警告ダイアログのコードがあります。

ここに画像の説明を入力

これが私のコードです:

private boolean toggle;

//an onCreate method here

public boolean onOptionsItemSelected(MenuItem item) {  
        switch (item.getItemId()) {       
        case R.id.deleteContact:
            if (selectedContactIndex == -1){
                Context context = getApplicationContext();
                CharSequence text = "Please select a contact to delete!";
                int duration = Toast.LENGTH_LONG;

                Toast toast = Toast.makeText(context, text, duration);
                toast.show();
                return true;
            }
            AlertDialog.Builder myAlertDialog = new AlertDialog.Builder(this, AlertDialog.THEME_DEVICE_DEFAULT_DARK);
            myAlertDialog.setTitle("           Confirm Contact Deletion");
            myAlertDialog.setMessage("Are you sure you want to delete " + Contact.contactList.get(selectedContactIndex).getFullName() + "?");

            myAlertDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface arg0, int arg1) {
                toggle = true;
            }});

            myAlertDialog.setNegativeButton("No", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface arg0, int arg1) {
                toggle = false;
            }});

            myAlertDialog.show();
            System.out.println(toggle);
            if (toggle) {
                Contact.contactList.remove(selectedContactIndex);
                for (int i = selectedContactIndex; i < Contact.contactList.size(); i++){
                    Contact.contactList.get(i).setContactNumber(i);
                }
                Contact.totalContacts--;
                selectedContactIndex = -1;
                contactsView.invalidateViews();
            }
    }

だから私がやった方法は、トグルという名前のブール値を持っているということです。ユーザーが [はい] をクリックすると、ブール値が true に設定され、if ステートメントが実行されて実際に連絡先が削除されます。system.out.print を使用してログ cat を確認しましたが、[はい] ボタンをクリックした後でもトグル変数が false になっているようです。

私が持っている 1 つの仮説は次のとおりです。ブール値のデフォルト値は false であるため、onClick メソッドはトグルに何も割り当てていない可能性があります。しかし、これを修正する方法がわかりません。

どんな助けでも大歓迎です。

編集:答えてくれてありがとう、連絡先削除ロジックをポジティブボタンのonClickメソッドに入れました。それは私が望むように機能しています! ここから得た主なことは、Android が常に線形に実行されるとは限らないことを認識することです。

4

5 に答える 5

3

取得する実際の理由toggle always falseは、すべての関数が同時に実行されるためです。それは、ダイログでアクションを実行する前ですif statment is also execute

Solution @ダイアログのトグルが true に設定されているif statementときにtoggle=true実行するので、代わりにダイアログの外側に配置します。Yesif statementyes click

AlertDialog.Builder myAlertDialog = new AlertDialog.Builder(this, AlertDialog.THEME_DEVICE_DEFAULT_DARK);
            myAlertDialog.setTitle("           Confirm Contact Deletion");
            myAlertDialog.setMessage("Are you sure you want to delete " + Contact.contactList.get(selectedContactIndex).getFullName() + "?");

            myAlertDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface arg0, int arg1) {
                //toggle = true;
                 //Here will be your if statement.
            }});

            myAlertDialog.setNegativeButton("No", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface arg0, int arg1) {
               // toggle = false;
            }});

            myAlertDialog.show();
            System.out.println(toggle);

            }
    }
于 2013-09-20T06:31:54.273 に答える
0

デフォルト値がfalseで、連絡先の削除後にアクティビティを更新する場合は、トグル値をfalseに設定します。これは、[はい]ボタンのクリックで変更されます

于 2013-09-20T06:33:41.463 に答える
0

onclick リスナーの外側に if ステートメントを配置するよりも、ロジックを onclick リスナーの内側に配置した方がよいでしょう。このようなことを試してください。

AlertDialog.Builder myAlertDialog = new AlertDialog.Builder(this, AlertDialog.THEME_DEVICE_DEFAULT_DARK);
     myAlertDialog.setTitle("           Confirm Contact Deletion");
     myAlertDialog.setMessage("Are you sure you want to delete " + Contact.contactList.get(selectedContactIndex).getFullName() + "?");

     myAlertDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface arg0, int arg1) {
                    toggle = true;
                    Contact.contactList.remove(selectedContactIndex);
                for (int i = selectedContactIndex; i < Contact.contactList.size(); i++){
                    Contact.contactList.get(i).setContactNumber(i);
                }
                Contact.totalContacts--;
                selectedContactIndex = -1;
                contactsView.invalidateViews();
     }});

     myAlertDialog.setNegativeButton("No", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface arg0, int arg1) {
                    toggle = false;
     }});


     myAlertDialog.show();
于 2013-09-20T06:34:04.080 に答える
0

onclick リスナーの関数は、ユーザーが yes または no をクリックした後にのみ呼び出されます。その時点で、連絡先を削除するコードは既に実行されています。コードの実行は線形ではなく、クリック リスナー関数です。後で呼び出されます。

このようなことを試して、正しい方向に進んでください

myAlertDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface arg0, int arg1) {
        Contact.contactList.remove(selectedContactIndex);
        for (int i = selectedContactIndex; i < Contact.contactList.size(); i++){
            Contact.contactList.get(i).setContactNumber(i);
        }
        Contact.totalContacts--;
        selectedContactIndex = -1;
        contactsView.invalidateViews();
    }
});
于 2013-09-20T06:34:48.567 に答える
-2

変数を次のように宣言しますprivate boolean toggle = true;

于 2013-09-20T06:32:34.303 に答える