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