我正在使用与Android用于显示android.R.layout.select_dialog_item
相同的内置AlertDialog
来显示AlertDialog:
void showCustomAlertDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Choose any item");
final List<String> items = new ArrayList<String>();
items.add("Red");
items.add("Green");
items.add("Blue");
final TypedArray a = obtainStyledAttributes(null,
R.styleable.AlertDialog, R.attr.alertDialogStyle, 0);
final int listItemLayoutId = a.getResourceId(
R.styleable.AlertDialog_listItemLayout,
android.R.layout.select_dialog_item);
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
listItemLayoutId, items);
builder.setAdapter(dataAdapter, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
该代码类似于我在源代码中看到的代码:https://github.com/aosp-mirror/platform_frameworks_base/blob/master/core/java/com/android/internal/app/AlertController.java#L229
我还在显示另一个AlertDialog,但使用的是setItems()
:
void showStandardAlertDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Choose any item");
final CharSequence[] items = {"Red", "Green", "Blue"};
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
显示的两个对话框的项目显示方式略有不同,填充方式也不同:
为什么不同,差异来自何处?
无论当前主题如何,如何显示带有自定义项目布局的AlertDialog,但其外观与使用setItems时完全相同?
为您提供一些背景信息:我实际上想做的是显示一个AlertDialog
,该项目显示的外观与setItems()
相似,但显示的是{ {1}}。为此,我需要将背景设置为dialog.getListView().setSelection(somePos)
的项目布局。
但是首先,我需要弄清楚如何获得android:attr/activatedBackgroundIndicator
使用的确切外观。
答案 0 :(得分:2)
区别在于您创建的适配器的Context
中传递的主题以及使用setItems
时在内部创建的适配器。
您必须传递使用默认对话框主题而不是this
(使用Activity主题)的上下文。您可以从AlertDialog.Builder
获取该上下文:
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(builder.getContext(),
listItemLayoutId, items);
AlertDialog.Builder#getContext()
docs说:
为此构建器创建的对话框返回具有适当主题的上下文。应用程序应使用此Context获取用于扩展视图的LayoutInflaters,这些视图将在结果对话框中使用,因为它将导致视图以正确的主题进行扩展。
但是他们应该在setAdapter()
的文档中提到过。