2016-10-19 2 views
0

Ich habe eine Methode, um etwas aus einer Datenbank zu löschen. Ich möchte die Bestätigung des Benutzers erhalten. Um dies zu tun, implementiere ich eine boolesche Funktion, um die Bestätigung mit einem Dialog zu erhalten.Dialog Nachricht Tasten nicht tun, was in dem Code ist?

Nun mein Problem ist, dass es egal ist, ob ich Ja oder Nein wähle, bekomme ich immer das gleiche falsche Ergebnis.

(I verwendet final boolean [] beacuse sonst bekomme ich einen Fehler)

Dies ist die Methode:

public boolean alertMessage() { //Confirmation to delete routine 
    final boolean[] confirmation = {false}; 
    DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
      switch (which) { 
       case DialogInterface.BUTTON_POSITIVE: 
        // Yes button clicked 
        confirmation[0] =true; 
        break; 
       case DialogInterface.BUTTON_NEGATIVE: 
        // No button clicked 
        // do nothing 
        confirmation[0]=false; 
        break; 
      } 
     } 
    }; 

    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setMessage(R.string.sure_delete) 
      .setPositiveButton(R.string.yes, dialogClickListener) 
      .setNegativeButton(R.string.no, dialogClickListener).show(); 
    return confirmation[0]; 
} 

Und das ist, wie ich es in meinem löschen Code überprüfen:

//CONFIRMATION 
if(!alertMessage()){ 
return; 
} 

Update: Versuchen Sie dies mit einem Vorschlag Vorschlag, aber immer noch das gleiche:

public boolean alertMessage() { //Confirmation to delete routine 
    final boolean[] confirmation = {false}; 
    new AlertDialog.Builder(this) 
      .setTitle(R.string.delete) 
      .setMessage(R.string.sure_delete) 
      .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        confirmation[0]=true; 
       } 
      }) 
      .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        confirmation[0]=false; 
       } 
      }) 
      .setIcon(android.R.drawable.ic_dialog_alert) 
      .show(); 
    return confirmation[0]; 
} 

Ich habe letzte boolean [] becuase mit nur einem boolean ich eine Fehlermeldung erhalten:

"Variable is accessed from within an inner class, needs to be declared final." 

Und wenn ich erkläre es endgültig:

"Can not assign a value to final variable" 

Also muss ich es verwandeln sich in eine Anordnung. Ich möchte, dass es eine boolesche Methode ist und das Löschen nicht innerhalb des "Ja" implementieren, weil ich es in anderen Methoden wiederverwenden möchte.

+0

Dumme Frage, aber: Warum sind Sie ein Array von boolean verwendet? – compte14031879

+1

Versuchen Sie dies. Ich empfehle Ihnen, die Methode gemäß dem folgenden Link zu verwenden und die Delete-Inside-Positive-Button-Implementierung durchzuführen. http://stackoverflow.com/questions/2115758/how-do-i-display-an-alert-dialog-on-android – vidulaJ

+0

@ FrédéricLétellier: Ich vermute, dass dies getan wird, weil wenn nur 'final boolean' dann onClick würde nicht in der Lage sein, den Wert zu ändern, während der Wert innerhalb des Arrays sein kann. –

Antwort

0

wie Sie wollen, das gleiche Dialogfeld für verschiedene Aktionen auf differents Elementen derselben Liste:

public final static TAG_UPDATE = "update"; 
public final static TAG_DELETE = "delete"; 

public void alertMessage(String id, String actionTag) { //the same call for all elements of a list 
final String mIdElement = idElement; 
final String mActionTag = actionTag; 

new AlertDialog.Builder(this) 
     .setTitle(R.string.confirmation) 
     .setMessage(R.string.sure_confirmation) 
     .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       makeSomething(mIdElement, mActionTag); 
      } 
     }) 
     .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       //no-op 
      } 
     }) 
     .setIcon(android.R.drawable.ic_dialog_alert) 
     .show(); 
} 

public void makeSomething(String idElement, String actionTag){ 
    switch(actionTag) { 
     case TAG_UPDATE : 
      // your update code to update the id element 
      break; 
     case TAG_DELETE : 
      // your delete code to delete the id element 
      break; 
    } 
} 
+0

Dies funktioniert, aber wenn ich den Bestätigungsdialog für einen anderen Zweck wiederverwenden will, kann ich nicht tun es. – nck

+0

Wenn Sie ein Element einer Liste löschen möchten, ist dies derselbe Dialog für alle Elemente. Rufen Sie die Methode mit Parametern (zB: ID des Elements) auf und übergeben Sie diese Parameter an die Methode delete. Wenn Sie den gleichen Dialog für verschiedene Elemente verwenden möchten, sind Sie vielleicht auf dem schlechten Weg. – compte14031879

+0

Ich meine, wenn ich den gleichen Dialog für verschiedene Aktionen wie "update", "delete" oder "add" mit zum Beispiel verwenden möchte private boolean showConfirmationDialog (String message). Ich werde es nicht auf diese Weise tun können. – nck

1

Dies liegt daran, dass der Code nicht ausgeführt wird nicht mehr, wenn Sie ein Dialogfenster, so dass Ihre Methode wird gibt immer false zurück, da es dem Standardwert zugewiesen ist. Der beste Weg für Sie, eine Löschbestätigung zu verlangen, besteht darin, die Löschmethode innerhalb der positiven Schaltfläche des Dialogfelds aufzurufen.

Angenommen, Sie haben eine Listenansicht und möchten ein Element löschen, wenn darauf geklickt wird. Hier ist, wie Sie es tun sollten.

public class MyActivity extends AppCompatActivity { 


    public ListViewCompat listView; 
    private List<Object> myObjects; 

    public void onCreate(Bundle savedinstance) { 
     super.onCreate(savedinstance); 
     setContentView(R.layout.activity_my_list); 

     listView = (ListViewCompat) findViewById(R.id.my_list_view); 
     //Set a listview adapter 

     listView.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view,int position, long id) { 
       showConfirmationDialog(position);   
      } 
     }); 
    } 

    private void showConfirmationDialog(int itemPosition) { 
     AlerDialog.Builder builder = new AlerDialog.Builder(this); 

     builder.setTitle("Confirmation"); 
     builder.setMessage("Delete item?") 
     builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
      deleteItem(itemPosition); 
     }); 
     builder.setNegativeButton("No", null); 

     builder.create().show(); 
    } 

    private void deleteItem(int itemPosition) { 
     //Delete item 
     myObjects.remove(itemPosition); 
    } 
} 
+0

Es ist das gleiche wie in Frederic Antwort, wenn ich den Dialog wiederverwenden möchte, der nicht funktioniert. – nck

+0

Ich glaube nicht, dass es in diesem Fall ein Problem ist, da der Dialog innerhalb einer Methode erstellt wird und es keine Möglichkeit gibt, ihn in einer anderen Methode aufzurufen –

0

try Schnittstellen:

public class MainActivity extends AppCompatActivity implements DialogInterface.OnClickListener { 

    private static final String TAG = MainActivity.class.getSimpleName(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.e(TAG, "onCreate"); 
     setContentView(R.layout.activity_main); 

     new AlertDialog.Builder(this) 
       .setTitle("Hello") 
       .setMessage("World") 
       .setPositiveButton(android.R.string.yes, this) 
       .setNegativeButton(android.R.string.no, this) 
     .show(); 

    } 

    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     switch(which) { 
      case DialogInterface.BUTTON_POSITIVE: 
       Log.d(TAG, "Ok"); 
       break; 
      case DialogInterface.BUTTON_NEGATIVE: 
       Log.d(TAG, "Cancel"); 
       break; 
     } 

    } 
}