android - Как да актуализирате елементите за множество избори на състоянието на диалоговия прозорец за предупреждение

В моето приложение показвам диалоговия прозорец за предупреждение, ако щракнете върху бутон. Диалоговият прозорец за предупреждение се състои от елементи с множество възможности за избор и 2 бутона (т.е. Ok и Cancel). Първоначално зададох някои елементи с помощта на масив (т.е. в кода choice_checked).

  1. Ако отворите диалоговия прозорец за предупреждение, направили сте някои промени и щракнете върху бутона OK, след което отхвърлете диалоговия прозорец и отворете отново диалоговия прозорец за предупреждение, след което той показва промените (т.е. това свойство по подразбиране на диалоговия прозорец за предупреждение).

  2. Ако отворите диалоговия прозорец за предупреждение, вие сте направили някои промени и щракнете върху бутона за отказ, след което отхвърлете диалоговия прозорец и отворете отново диалоговия прозорец за предупреждение, в този случай искам да покажа само предишното състояние (не показвайте промените). Опитах, но аз не получавам, моля, може ли някой да ми помогне.

  3. В кода choice_checked и choice_checked_dynamic са булевите масиви.choice_checked_dynamic е дубликат на choice_checked. Означава, че първоначално тези два масива са еднакви. Ако сте направили някои промени в списъка и щракнете върху бутона OK, тогава променения масив се копира в choice_checked_dynamic. По подразбиране диалоговият прозорец за предупреждение показва само промените, така че е добре за бутона OK. Но в случай на бутон за отмяна, това означава, че ако сте направили някои промени, щракнете върху бутона за отмяна, тогава искам да покажа статут на 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;
}

person naresh    schedule 29.12.2011    source източник


Отговори (3)


Мисля, че следният метод ще изпълни вашите изисквания.

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) {

}
person Thasneem    schedule 27.03.2012

Просто използвайте метода show() вместо метода create(), за да покажете диалоговия прозорец и да не връщате създадения диалогов прозорец в края.

dialog.show();  
return null;

Дейността не запазва състоянието на диалоговия прозорец, поради което отхвърлянето не работи, но натискането на бутона отхвърля диалоговия прозорец с множество избори от само себе си или можете да използвате deleteDialog(int id).

person Arvis    schedule 21.03.2012

В горния код проблемът е, че диалоговият прозорец ще бъде създаден само веднъж с помощта на 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();         
}
person naresh    schedule 30.12.2011