如何使用内置的AlertDialog_listItemLayout

时间:2019-07-14 12:04:56

标签: java android alertdialog android-alertdialog

我正在使用与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();
    }

显示的两个对话框的项目显示方式略有不同,填充方式也不同:

enter image description here

为什么不同,差异来自何处?

无论当前主题如何,如何显示带有自定义项目布局的AlertDialog,但其外观与使用setItems时完全相同?

为您提供一些背景信息:我实际上想做的是显示一个AlertDialog,该项目显示的外观与setItems()相似,但显示的是{ {1}}。为此,我需要将背景设置为dialog.getListView().setSelection(somePos)的项目布局。 但是首先,我需要弄清楚如何获得android:attr/activatedBackgroundIndicator使用的确切外观。

1 个答案:

答案 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()的文档中提到过。