2012-07-12 17 views
0

我正在嘗試使用動態數據構建多選AlertDialog。AlertDialog MultiChoice沒有給我正確的選擇

好的,這一切都加載偉大等,但選擇是搞砸了。

這裏是我的代碼:

new AlertDialog.Builder(this) 
     .setTitle("Cities") 
     .setMultiChoiceItems(_options, _selections, new DialogInterface.OnMultiChoiceClickListener(){ 

       @Override 
       public void onClick(DialogInterface dialog, int clicked, boolean selected) { 
         Log.i("Database", _options[clicked] + " selected: " + selected); 
       } 

     }) 
     .setPositiveButton("OK", new DialogInterface.OnClickListener(){ 

       @Override 
       public void onClick(DialogInterface dialog, int clicked) { 
        switch(clicked) { 
         case DialogInterface.BUTTON_POSITIVE: 
          for(int i = 0; i < _options.length; i++){ 
           Log.i("Database", "id: " + _values[i] + " " + _options[i] + " selected: " + _selections[i]); 
          } 
          break; 
        } 
       } 
     }) 
     .create(); 

正如你可以在logcat中看到,我描述了我的問題:

** OPENED ALERTDIALOG VIA A BUTTON AND SELECTED THE FOLLOWING: ** 
07-12 16:06:51.347: I/Database(8034): Aveiro selected: true 
07-12 16:06:53.936: I/Database(8034): Coimbra selected: true 
07-12 16:07:00.116: I/Database(8034): Porto selected: true 

** AFTER PRESSING THE OK BUTTON, THIS SHOWS UP, WHICH IS CORRECT: ** 
07-12 16:07:02.826: I/Database(8034): id: 1 Aveiro selected: true 
07-12 16:07:02.826: I/Database(8034): id: 2 Coimbra selected: true 
07-12 16:07:02.826: I/Database(8034): id: 3 Porto selected: true 
07-12 16:07:02.826: I/Database(8034): id: 4 Minho selected: false 

** I CLICKED THE BUTTON TO START THE DIALOG AGAIN DE UNSELECTED THE FOLLOWING: ** 
07-12 16:07:07.087: I/Database(8034): Coimbra selected: false 

** AFTER PRESSING THE OK BUTTON, ALL SHOWS AS FALSE. 1 AND 3 SHOULD BE TRUE: ** 
07-12 16:07:08.097: I/Database(8034): id: 1 Aveiro selected: false 
07-12 16:07:08.097: I/Database(8034): id: 2 Coimbra selected: false 
07-12 16:07:08.097: I/Database(8034): id: 3 Porto selected: false 
07-12 16:07:08.097: I/Database(8034): id: 4 Minho selected: false 
+1

你在哪裏更新這些陣列? – 2012-07-12 15:41:44

+0

哪些?如果它是'_selections',則它由AlertDialog方法'.setMultipleChoiceItems'自動更新。如果你問別人,他們對這個問題並不重要,我唯一的問題是'_selections'數組。 – silentw 2012-07-12 15:50:27

+0

剛剛試過你的代碼,它對我來說工作得很好。添加了我用來測試的代碼,所以你可以看到它。 – prolink007 2012-07-12 16:05:36

回答

1

編輯

想你的代碼,它是工作對於我來說足夠了。逐步完成並確保您的值是正確的。

這是我的測試應用程序。唯一的區別是我不知道_values是什麼,所以我把它拿出來了。

public class SandBoxActivity extends Activity { 

    private Button testButton; 

    private CharSequence[] _options = {"Aveiro", "Coimbra", "Porto", "Minho"}; 

    private boolean[] _selections = {true, true, true, false}; 

    private AlertDialog test; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     test = new AlertDialog.Builder(this) 
     .setTitle("Cities") 
     .setMultiChoiceItems(_options, _selections, new DialogInterface.OnMultiChoiceClickListener(){ 

       @Override 
       public void onClick(DialogInterface dialog, int clicked, boolean selected) { 
         Log.i("Database", _options[clicked] + " selected: " + selected); 
       } 

     }) 
     .setPositiveButton("OK", new DialogInterface.OnClickListener(){ 

       @Override 
       public void onClick(DialogInterface dialog, int clicked) { 
        switch(clicked) { 
         case DialogInterface.BUTTON_POSITIVE: 
          for(int i = 0; i < _options.length; i++){ 
           Log.i("Database", "id: " + " " + _options[i] + " selected: " + _selections[i]); 
          } 
          break; 
        } 
       } 
     }) 
     .create(); 

     this.testButton = (Button) findViewById(R.id.color_button); 
     this.testButton.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       test.show(); 
      } 
     }); 
    } 
} 

舊帖子

.setMultiChoiceItems(_options, _selections, new DialogInterface.OnMultiChoiceClickListener(){ 

       @Override 
       public void onClick(DialogInterface dialog, int clicked, boolean selected) { 
         Log.i("Database", _options[clicked] + " selected: " + selected); 
       } 

     }) 

我沒有看到你實際處理,它被點擊的事實。我看到您正在向日志中打印它被點擊的內容,但是您並未改變在您的_selections陣列中選擇的事實。這可能是你的問題。

試試這個:

.setMultiChoiceItems(_options, _selections, new DialogInterface.OnMultiChoiceClickListener(){ 

       @Override 
       public void onClick(DialogInterface dialog, int clicked, boolean selected) { 
         _selections[clicked] = selected; 
         Log.i("Database", _options[clicked] + " selected: " + selected); 
       } 

     }) 
+0

它由MultiChoiceItems自動處理(參數_selections是使用所選值自動更新的參數)。所以,你給我的解決方法並不能完成這項工作,因爲它給了我完全相同的輸出...... – silentw 2012-07-12 15:49:02

+0

我剛剛試過你的代碼,它對我來說工作得很好。 – prolink007 2012-07-12 16:04:17

+0

我試圖調試變量,但它沒有在Eclipse的變量選項卡(Java EE,Juno)上顯示任何變量。也許我做錯了什麼?我在Mac上... – silentw 2012-07-12 21:50:12

1

Silentw, 請仔細閱讀this

我們必須提供布爾數組每次它創建

另外需要更新你的代碼作爲選擇的選項如下

public void onClick(DialogInterface dialog, int clicked, boolean selected) 
{      
        if(!_selections[clicked]) 
         _selections[clicked] = true; 
        else 
         _selections[clicked]=false; 

         Log.i("Database", _options[clicked] + " selected: " + selected); 

} 
+0

'_selections'數組由'.setMultiChoiceItems'自動修改,不需要通過設置'_selections [clicked] = true;'重複多次...... – silentw 2012-07-12 15:56:59