我想在这个标准的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();
就在现在,它显示得很好:
我转而使用自定义布局:
<?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();
显示(列表可滚动):
有几件我无法弄清楚的事情:
答案 0 :(得分:2)
为什么我看不到列表中的单选按钮?
似乎设置android:entries
属性会使ListView
使用ArrayAdapter
作为布局创建com.android.internal.R.layout.simple_list_item_1
。我不知道该布局是否完全复制了android.R.layout.simple_list_item_1
布局,但如果确实如此,那么它只是TextView
,因此没有CheckBox
可用。
如何设置默认选中项?
如果我上面说的是真的,那么删除entries
属性并使用ListView
作为行布局在代码中为* levels_list * android.R.layout.simple_list_item_single_choice
设置适配器。
如何收听选择中的更改?
在布局的OnItemClickListener
上设置ListView
。
如何在复选框方块和复选框之间添加填充 文本。我试过android:paddingLeft,但是让它变得更糟,重叠 文字和正方形。我试过android:drawablePadding没效果。
使用简单的CheckBox
和TextView
代替CheckBox
,您可以随意放置。
为什么主题发生了变化? (不重要,只是好奇)
我不确定。首先,正如我上面所说,ListView
使用了一种特殊的布局(我不知道它的风格如何),而且你还在使用自定义视图而不是普通的ListView
内容可以用不同的方式设计。
如果您只想在标题中使用ChekcBox
,为什么不只是AlertDialog
上的set a custom title并继续使用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();