Android - Как обновить статус элементов с несколькими выборами в диалоговом окне оповещения - PullRequest
2 голосов
/ 29 декабря 2011

В моем приложении отображается диалоговое окно с предупреждением, если вы нажмете кнопку. Диалоговое окно предупреждения состоит из элементов с несколькими вариантами выбора и 2 кнопок (т. Е. Ok и Отмена). Сначала я установил некоторые элементы с помощью массива (т. Е. В коде choice_checked).

  1. Если вы откроете диалоговое окно оповещения, вы внесли некоторые изменения и нажмете кнопку «ОК», затем диалоговое окно закроется, и снова откроется диалоговое окно оповещения, в котором отобразятся изменения (т. Е. Это свойство по умолчанию диалогового окна оповещения).

  2. Если вы откроете диалоговое окно с предупреждением, вы внесли некоторые изменения и нажмете кнопку «Отмена», затем откроете диалоговое окно и снова откроете диалоговое окно с предупреждением. В этом случае я хочу показать только предыдущий статус (не показывать изменения ). Я пытался, но я не получаю, пожалуйста, может ли тело помочь мне.

  3. В коде choice_checked и choice_checked_dynamic являются логическими значениями arrays.choice_checked_dynamic является дубликатом choice_checked. Значит изначально эти два массива одинаковы. Если вы внесли некоторые изменения в список и нажали кнопку «ОК», то измененный массив будет скопирован в choice_checked_dynamic. По умолчанию диалоговое окно оповещения отображает только изменения, так что это нормально для кнопки ОК. Но в случае кнопки отмены, означает, что если вы сделали некоторые изменения, затем нажмите на кнопку отмены, тогда я хочу отобразить статус choice_checked_dynamic (означает, что я отображал предыдущий статус).

Я пытался, но я не получаю пожалуйста Кто-нибудь может мне помочь.

Код:

private OnClickListener bookmark_btnListener = new OnClickListener()

{

    public void onClick(View v)
    {
        try
        {                                   
             showDialog(DIALOG_MULTI_CHOICE);
        }
        catch(Exception ex2)
        {
            System.out.println("back btn error:"+ex2.toString());
        }
    }
};

protected Dialog onCreateDialog(int id) {
    switch (id) { 
    case DIALOG_MULTI_CHOICE:                                        
         bookmark_dialog = new AlertDialog.Builder(this);
         bookmark_dialog.setTitle("Bookmarking for");
         bookmark_dialog.setMultiChoiceItems(choice, choice_checked, new OnMultiChoiceClickListener() {
             public void onClick(DialogInterface dialog, int index, boolean status)
             {                        

             }                  
         });

         bookmark_dialog.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int whichButton) 
           {                   
               for(int i=0;i<choice_checked.length;i++)
            {
               choice_checked_dynamic[i] = choice_checked[i];               
            }
               dialog.dismiss();
           }
         });
         bookmark_dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int whichButton) 
           {   
               for(int i=0;i<choice_checked_dynamic.length;i++)
               {
                    choice_checked[i] = choice_checked_dynamic[i];              
               }              
               dialog.dismiss();
           }
       });
         return bookmark_dialog.create();         
    }
    return null;
}

Ответы [ 3 ]

0 голосов
/ 21 марта 2012

Просто используйте show () вместо create () метод, чтобы показать диалог и не возвращать созданный диалог в конце.

dialog.show();  
return null;

Активность не сохраняет состояние диалога, поэтому отключение не работает, но нажатие кнопки само по себе закрывает многошумный диалог, или вы можете использовать deleteDialog (int id).

0 голосов
/ 27 марта 2012

Я думаю, что следующий метод удовлетворит ваше требование.

protected void showMultipleChoiceItems(final String[] items,
        final boolean[] selections, String title,
        boolean cancelButtonDisabled) {

    Builder alertDialogBuilder = new Builder(this);
    alertDialogBuilder.setTitle(title);

    alertDialogBuilder.setMultiChoiceItems(items, selections,
            new OnMultiChoiceClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which,
                        boolean isChecked) {
                    selections[which] = isChecked;

                }
            });

    alertDialogBuilder.setNeutralButton(
            "OK", new OnClickListener() {

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

                }
            });

    if (cancelButtonDisabled)
        alertDialogBuilder.setCancelable(false);
    else
        alertDialogBuilder.setNegativeButton(
                "Cancel", null);

    final AlertDialog alertDialog = alertDialogBuilder.create();
    alertDialog.show();

    final Button btnOk = alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL);
    btnOk.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            alertDialog.dismiss();
            onMultiSelect(items, selections);               

        }
    });
}

// Override this method in the activity to define action on making multiple
// selections
public void onMultiSelect(String[] items, boolean[] selections) {

}
0 голосов
/ 30 декабря 2011

В приведенном выше коде проблема заключается в том, что диалоговое окно будет создано только один раз с помощью onCreateDialog (), если вы впервые нажмете кнопку.В следующий раз будет открыто только диалоговое окно без изменений.Поэтому я не рекомендую onCreateDialog () для этого случая.Здесь я создаю диалог для каждого нажатия кнопки и показываю его.

// Code:
AlertDialog.Builder bookmark_dialog_obj;

private OnClickListener bookmark_btnListener = new OnClickListener()
{

    public void onClick(View v)
    {
        try
    {                                   
        Bookmark_Dialog(RB_UpcomingRestaurantDetails.this); 
    }
    catch(Exception ex2)
    {
        System.out.println("back btn error:"+ex2.toString());
    }
}


public void Bookmark_Dialog(Context context) 
{

    System.out.println("onCreate Choice_Checked:"+Arrays.toString(choice_checked));                                  
    bookmark_dialog_obj = new AlertDialog.Builder(context);
    bookmark_dialog_obj.setTitle("Bookmarking for");
    bookmark_dialog_obj.setMultiChoiceItems(choice, choice_checked, new OnMultiChoiceClickListener() {
        public void onClick(DialogInterface dialog, int index, boolean status)
        {                     

        }                   
    });

    bookmark_dialog_obj.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) 
        {                      
            for(int i=0;i<choice_checked.length;i++)
            {
                choice_checked_dynamic[i] = choice_checked[i];               
            }            
        }
    });
    bookmark_dialog_obj.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) 
        {   
            for(int i=0;i<choice_checked_dynamic.length;i++)
            {
                choice_checked[i] = choice_checked_dynamic[i];              
            }      
            System.out.println("onCreate Cancel Choice_Checked:"+Arrays.toString(choice_checked));  
        }
    });
    bookmark_dialog_obj.show();         
}
...