2011-08-28 94 views
4

有沒有辦法獲得有關下一個Alert.Builder中檢查項目的一些信息?當有人點擊肯定按鈕時,我需要在SharedPreferences中保存一些布爾值。這些布爾值來自用戶在警報中做出的選擇。我怎樣才能得到它們?如何從Alert.Builder中的多項選擇項中獲取選中的項目?

 AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     final SharedPreferences preferences = getSharedPreferences("type_settings", MODE_PRIVATE); 

     boolean[] selectedTypes = getSelectedTypes(preferences); 

     builder.setIcon(R.drawable.menu_type) 
       .setTitle(R.string.list_dialog_title) 
       .setMultiChoiceItems(R.array.select_type_items, selectedTypes, 
         new DialogInterface.OnMultiChoiceClickListener() { 
          public void onClick(DialogInterface dialog, int whichButton, boolean isChecked) { 
          } 
         }) 
       .setPositiveButton(R.string.types_save, new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 
         SharedPreferences.Editor prefEditor = preferences.edit(); 
        } 
       }) 
       .setNegativeButton(R.string.types_cancel, new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 
         dialog.cancel(); 
        } 
       }) 
       .create(); 
     builder.show(); 

回答

2

我設法解決以某種方式的問題,但我不知道這是否是一個很好的做法。以下是代碼:

 AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     final SharedPreferences preferences = getSharedPreferences("type_settings", MODE_PRIVATE); 

     final String[] availableTypes = getResources().getStringArray(R.array.select_type_items); 
     final boolean[] selectedTypes = getSelectedTypes(preferences, availableTypes); 

     builder.setIcon(R.drawable.menu_type) 
       .setTitle(R.string.list_dialog_title) 
       .setMultiChoiceItems(R.array.select_type_items, selectedTypes, 
         new DialogInterface.OnMultiChoiceClickListener() { 
          public void onClick(DialogInterface dialog, int whichButton, boolean isChecked) { 
           selectedTypes[whichButton] = isChecked; 
          } 
         }) 
       .setPositiveButton(R.string.types_save, new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 
         SharedPreferences.Editor prefEditor = preferences.edit(); 
         saveSelectedTypes(prefEditor, availableTypes, selectedTypes); 
        } 
       }) 
       .setNegativeButton(R.string.types_cancel, new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 
         dialog.cancel(); 
        } 
       }) 
       .create(); 
     builder.show(); 
+0

好的解決方案。但是隻保存選定的項目到首選項是正確的方法。您正在儲存所有物品,甚至是未經檢查的物品。那麼如果它適合你的需求。 – Ronnie

+0

我想我也會需要未經檢查的,但無論如何,我的數組並不是很大,只有15個元素。 – DaJackal

+0

可以包含saveSelectedTypes的代碼嗎?我想將selecteditem的值保存到sharedpreferences中 – HeartlessArchangel

9

你可以使用getCheckedItemIds()getCheckedItemPositions()來從列表視圖檢查的項目清單。您應該首先使用AlertDialog.getListView()來獲取對話框的列表視圖。

mAlert.getListView().getCheckedItemPositions(); 
0

爲了提高存儲效率,可以將布爾數組轉換爲整數,然後將其存儲爲首選項。但要注意,初始化AlertDialog列表的布爾數組與AlertDialog的布爾數組結果具有相反的順序。 (似乎是一致的逆轉:發生在OS 2.3.6和4.2.2 ...我沒有檢查任何其他版本。)

相關問題