2016-10-19 4 views
0

У меня есть способ удалить что-то из базы данных. Я хочу получить подтверждение пользователя. Для этого я реализую логическую функцию, чтобы получить подтверждение с помощью диалогового окна.Диалоговые кнопки сообщений не делают то, что находится внутри кода?

Ну, моя проблема в том, что неважно, выбираю ли я да или нет, я всегда получаю тот же ложный результат.

(я использовал окончательное логическое [] beacuse в противном случае я получаю сообщение об ошибке)

Это метод:

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]; 
} 

И это, как я проверить его в моем удаления кода:

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

Обновление: Попробуйте это с одним предложением ответа, но все тот же:

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]; 
} 

Я положил окончательные логический [] becuase только с булевым я получаю сообщение об ошибке:

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

И когда я объявляю его окончательным:

"Can not assign a value to final variable" 

Так что я должен превратить его в массив. Я бы хотел, чтобы это был логический метод и не реализовал удаление внутри «да», потому что я хочу его повторно использовать в других методах.

+0

Глупый вопрос, но: почему вы используете массив булевых? – compte14031879

+1

Попробуйте это. Я рекомендую вам использовать метод в соответствии со следующей ссылкой и выполнить удаление внутри реализации положительной кнопки. http://stackoverflow.com/questions/2115758/how-do-i-display-an-alert-dialog-on-android – vidulaJ

+0

@ FrédéricLetellier: Я подозреваю, что это сделано, потому что, если использовать только 'final boolean', тогда onClick будет не сможет изменить значение, тогда как значение внутри массива может быть. –

ответ

0

Как вы хотите, то же самое диалоговое окно для Дифференц действий по Дифференц элементов одного и того же списка:

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

Это работает, но если я хочу повторно использовать диалоговое окно подтверждения для другой цели, я не смогу сделать Это. – nck

+0

Если вы хотите удалить элемент списка, это тот же диалог для всего элемента. Вызовите метод с параметрами (ex: id элемента) и передайте эти параметры методу удаления. Если вы хотите использовать один и тот же диалог для разных элементов, возможно, вы ошибаетесь. – compte14031879

+0

Я имею в виду, если я хочу использовать тот же диалог для разных действий, например «обновление», «удалить» или «добавить», например, private boolean showConfirmationDialog (сообщение String). Я не смогу сделать это таким образом. – nck

1

Это потому, что ваш код не перестает работать, когда вы показываете диалоговое окно, так что ваш метод будет всегда возвращать false, так как это назначенное ему значение по умолчанию. Лучший способ попросить подтверждение удаления - это вызвать метод удаления, который вызывается внутри положительной кнопки диалога.

Предположим, у вас есть список, и вы хотите удалить элемент при его нажатии. Вот как вы должны это делать.

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

Это то же самое, что и у Фредерика, если я хочу повторно использовать диалог, который не будет работать. – nck

+0

Я не думаю, что это проблема в этом случае, поскольку диалог будет создан внутри метода, и не будет способа вызвать его в другом –

0

использовать Try интерфейсы:

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

    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^