1

我想一個複選框添加到該標準AlertDialog室內用一個選擇列表添加一個複選框,設置AlertDialog

new AlertDialog.Builder(this) 
.setSingleChoiceItems(R.array.difficultyLevel_list, 1, new DialogInterface.OnClickListener() { 
    @Override public void onClick(DialogInterface dialog, int which) { level = which; } 
}) 
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 
    @Override 
    public void onClick(DialogInterface dialog, int which) { 
    } 
}) 
.setNegativeButton(android.R.string.cancel, null) 
.show(); 

現在,因爲它是一個singlechoice,它很好地說明:

enter image description here

我轉向使用自定義佈局:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" > 

    <CheckBox 
     android:id="@+id/levels_keep" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="10dp" 
     android:layout_marginTop="10dp" 
     android:checked="false" 
     android:text="@string/levels_keep" /> 

    <ListView 
     android:id="@+id/levels_list" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:entries="@array/difficultyLevel_list" 
     android:choiceMode="singleChoice" /> 

</LinearLayout> 

使用此代碼:

LayoutInflater inflater = getLayoutInflater(); 
final View customView = inflater.inflate(R.layout.dialog_levels, null); 
final ListView list = (ListView) customView.findViewById(R.id.levels_list); 
final CheckBox keep = (CheckBox) customView.findViewById(R.id.levels_keep); 
// list.setSelected(level); 
list.setItemChecked(level, true); // Marks the item as checked 
list.setOnItemClickListener(new OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     level = position; 
    } 
}); 

new AlertDialog.Builder(this) 
.setView(customView) 
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 
    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     CheckBox keep = (CheckBox) findViewById(R.id.levels_keep); 
     if(keep.isChecked()) { 
      Context context = PlayersActivity.this; 
      SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); 
      Editor editor = sp.edit(); 
      editor.putString(context.getString(R.string.pref_level_key), String.valueOf(level)); 
      editor.commit(); 
     } 
    } 
}) 
.setNegativeButton(android.R.string.cancel, null) 
.show(); 

這說明(名單是滾動):

enter image description here

有幾件事情我想不通:

  1. 爲什麼我沒有看到單選按鈕列表?
  2. 如何設置默認選中項目? (使用解決方案編輯代碼)
  3. 如何聆聽選擇中的更改? (編輯了代碼,因爲我發現該怎麼做)
  4. 如何在複選框正方形和複選框文本之間添加填充。我嘗試了android:paddingLeft,但它使情況變得更糟,重疊了文本和方塊。我試過android:drawablePadding沒有任何效果。
  5. 爲什麼主題變了? (不很重要,只是好奇)編輯看來,主題顏色都搞砸了,當我在項目上點擊它的文本顏色爲黑「dissapear」入行的背景
+0

請不要在* Android *前加問題的標題,因爲它只是增加了噪音,底部的標籤綽綽有餘。 – Luksprog 2013-03-16 12:52:41

回答

2

爲什麼我在列表中看不到單選按鈕?

似乎設置android:entries屬性使得ListView使用com.android.internal.R.layout.simple_list_item_1作爲佈局創建ArrayAdapter。我不知道該佈局是否完全複製android.R.layout.simple_list_item_1佈局,但是如果它的確如此,那麼它只是TextView,因此沒有CheckBox可用。

如何設置默認選中項目?

如果我上面說的是真的,然後取出entries屬性和使用android.R.layout.simple_list_item_single_choice爲行佈局在代碼中設置適配器爲* levels_list * ListView

如何聆聽選擇中的更改?

在佈局上設置ListViewOnItemClickListener

如何在複選框正方形和複選框 文本之間添加填充。我嘗試了android:paddingLeft,但是使它變得更糟,重疊 文字和方塊。我試過android:drawablePadding沒有任何效果。

使用簡單的CheckBoxTextView,而不是僅僅一個CheckBox,你可以把那些請你。

爲什麼主題變了? (沒有真正重要,只是好奇)

我不確定。首先,如上所述,ListView使用特殊佈局(我不知道它是如何設計的),而且您使用的是自定義視圖,而不是正常的ListView內容,這些內容的樣式可能不同。

如果您只想在標題中使用ChekcBox,爲什麼不只是set a custom titleAlertDialog繼續使用setSingleChoiceItems

編輯由OP與解決方案

我在這裏發佈的工作代碼,因爲它肯定是立足於Luksprog答案,我想將其標記爲答案。此代碼已經過測試並且正常工作。

LayoutInflater inflater = getLayoutInflater(); 
final View customView = inflater.inflate(R.layout.dialog_levels, null); 
final ListView list = (ListView) customView.findViewById(R.id.levels_list); 
final CheckBox keep = (CheckBox) customView.findViewById(R.id.levels_keep); 
String [] items = getResources().getStringArray(R.array.difficultyLevel_list); 
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_single_choice, items); 
list.setAdapter(adapter); 
list.setItemChecked(level, true); 
list.setOnItemClickListener(new OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     level = position; 
    } 
}); 

new AlertDialog.Builder(this) 
.setView(customView) 
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 
    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     MyLog.w(TAG,"Level is " + level); 
     if(keep.isChecked()) { 
      Context context = PlayersActivity.this; 
      SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); 
      Editor editor = sp.edit(); 
      editor.putString(context.getString(R.string.pref_level_key), String.valueOf(level)); 
      editor.commit(); 
     } 
    } 
}) 
.setNegativeButton(android.R.string.cancel, null) 
.show(); 
+0

謝謝。該複選框不是標題,我把它放在上面,否則,根據設備,它被置於屏幕外。我將不得不在垂直滾動中將所有信封都包含在內。通過這種方式,複選框始終可見,ListView可以通過定義滾動。 – ilomambo 2013-03-16 12:58:10

+0

@ilomambo如果您還設置了'AlertDialog'的標題,我的建議就沒用了。在代碼中爲'ListView'設置適配器。另外,你不應該在對話框中尋找'CheckBox':'((Dialog)dialog).findViewById(etc)'?現在它工作? – Luksprog 2013-03-16 13:04:53

+0

查看我最近的修改,我找到了問題2和3的解決方案,我編輯的代碼反映了這一點,它包括爲複選框和列表視圖創建視圖ID。 – ilomambo 2013-03-16 13:10:38