2010-08-31 15 views
12

嗨,繃複選框在MultiChoice AlertDialog在android系統

我創建了MultiChoice AlertDialog的AlertDialog有複選框5個 列表項。當我檢查第一個複選框時,如果檢查到列表 中的其他複選框被選中,它們將自動取消選中 ,反之亦然。

我檢查在器isChecked OnMultiChoiceClickListener()的onClick方法狀態 並調用 的ShowDialog(DIALOG_MULTIPLE_CHOICE);通過更新布爾值[] checkedItems;重新創建 對話框,但我無法實現它。 如果您有任何建議,請直接 我以正確的方式。

有沒有什麼辦法重新創建點擊單選按鈕的AleClickDialog onClick事件。

一些示例代碼如下:

case DIALOG_MULTIPLE_CHOICE: 
final String[] lJobTypes = { "Item1", "Item2", "Item3","Item4", "Item5" }; 
    return new AlertDialog.Builder(JoblistPage.this) 
    // .setIcon(R.drawable.logo) 
    .setTitle("Title Here") 
    // .setCustomTitle(m_Title) 
    .setMultiChoiceItems(lTypes, m_Selections, 
     new DialogInterface.OnMultiChoiceClickListener() { 

      public void onClick(DialogInterface dialog,int whichButton, boolean isChecked) { 
       /* User clicked on a check box do some stuff */ 
       if (isChecked) { 
        m_CheckCount++; 
        //Toggle the Radio button Check status 
       } else { 
        m_CheckCount--; 
       } 
               } 
     }).setPositiveButton("Ok", 
     new DialogInterface.OnClickListener() { 

      public void onClick(DialogInterface dialog, 
        int whichButton) { 
        } 
       }).create(); 

問候 維納亞克

+0

你的意思是使用RadioButton嗎?什麼是屬性?你爲什麼不發佈一些代碼來消除一些猜測? – jacknad 2010-08-31 10:23:40

+0

HI JackN,我用代碼更新了問題,這可能會使你更加清楚 – 2010-08-31 10:50:15

回答

19

不要重新創建對話框,只需切換當前對話框中的複選框。您的onMultiChoiceClickListener可以跟蹤當前處於活動狀態的複選框(如果有),並在選擇其他複選框時取消選中它。這裏有一個完整的測試,工作示例:

package com.stackoverflow.beekeeper; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.AlertDialog.Builder; 
import android.content.DialogInterface; 
import android.content.DialogInterface.OnClickListener; 
import android.content.DialogInterface.OnMultiChoiceClickListener; 
import android.os.Bundle; 
import android.widget.ListView; 
import android.widget.Toast; 

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

    private int mSelected = -1; 

    @Override protected void onResume() { 
    super.onResume(); 
    final Builder build = new Builder(this); 
    build.setTitle("List selection"); 
    build.setCancelable(true); 
    final String[] strings = new String[]{"Cow", "Horse", "Goat"}; 
    final OnMultiChoiceClickListener onClick = 
     new OnMultiChoiceClickListener() { 
     @Override public void onClick(final DialogInterface dialog, 
             final int which, final boolean isChecked) { 

      if (isChecked) { 
      if ((mSelected != -1) && (mSelected != which)) { 
       final int oldVal = mSelected; 
       final AlertDialog alert = (AlertDialog)dialog; 
       final ListView list = alert.getListView(); 
       list.setItemChecked(oldVal, false); 
      } 
      mSelected = which; 
      } else 
      mSelected = -1; 
     } 
     }; 
    build.setMultiChoiceItems(strings, null, onClick); 
    build.setPositiveButton("Done", new OnClickListener() { 
     @Override public void onClick(final DialogInterface dialog, 
            final int which) { 
     String message = null; 
     if (mSelected == -1) 
      message = "You didn't select anything."; 
     else 
      message = "You selected '" + strings[mSelected] + "'"; 
     Toast.makeText(StackOverflowTest.this, message, Toast.LENGTH_LONG).show(); 
     } 
    }); 
    build.show(); 
    } 
} 

有一點需要注意的:你必須在你的「setMultiChoiceItems」呼叫指定「空」爲「checkedItems」參數 - 否則「setItemChecked」調用不會按預期工作。它最終會使用該數組來存儲選中狀態,而「setItemChecked」將不會正確更新它,所以一切都會變得混亂。奇怪的,但是是真的。

2

你嘗試在對話框中替換setMultiChoiceItemssetSingleChoiceItems

+0

然後就不會再切換複選框了......我想要多項選擇,因爲這個切換功能(list1 checkbos被選中,然後是List2, list3.list4,list5應該是未選中的,如果2,3,4或5中的任何一個被選中,list1複選框shub將被取消選中) – 2010-08-31 11:09:37

+0

同樣考慮到按鈕位置被點擊的情況。檢查名爲「whichbutton」的參數,它應該給你已被點擊的項目的位置 – DeRagan 2010-08-31 12:05:44

+0

是的,但是如何在該事件中重新創建對話框 – 2010-08-31 12:11:11

5

我一直在爲此奮鬥了一段時間。我維護每個項目的「checked」狀態的數組,並在視覺上改變setItemChecked值的同時更改該值。然後當完成按鈕被點擊時,我遍歷「checked」將值保存到我的數據庫。

builder.setMultiChoiceItems(cats, checked, new DialogInterface.OnMultiChoiceClickListener() { 
     public void onClick(DialogInterface dialog, int item, boolean check) { 
      if(cats[item].equals("All Categories")) { 
       AlertDialog d = (AlertDialog) dialog; 
       ListView v = d.getListView(); 
       int i = 0; 
       while(i < cats.length) { 
        v.setItemChecked(i, check); 
        checked[i] = check; 
        i++; 
       } 
      } 
      checked[item] = check; 
     } 
    });