Android AlertDialog自定义视图

问题描述 投票:1回答:1

我在Stack Overflow上搜索了这个主题。但是,我找不到任何类似的问题。

我有一个带有自定义布局的警告对话框。当我尝试使用警告对话框的findViewById方法访问此自定义布局中的任何视图时,我最终得到空指针异常。

自定义对话框的XML布局如下:

    <TextView
        style="@style/TextAppearance.AppCompat.Title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="@dimen/padding_large"
        android:text="@string/settings" />

    <TextView
        style="@style/TextAppearance.AppCompat.Subhead"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="@dimen/padding_large"
        android:text="Search Distance" />

    <SeekBar
        android:id="@+id/sb_distance"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="25"
        android:padding="@dimen/padding_large" />
</LinearLayout>

以下是访问布局的代码:

AlertDialog settingsDialog = new AlertDialog.Builder(getActivity()).
                setTitle(R.string.settings)
                .setView(R.layout.layout_distance_settings)
                .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        // Do sth here
                        dialogInterface.dismiss();
                    }
                })
                .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        dialogInterface.dismiss();
                    }
                })
                .create();

        SeekBar distanceSB = (SeekBar) settingsDialog.findViewById(R.id.sb_distance);
        distanceSB.setProgress(5);
        settingsDialog.show();

使用布局inflater创建布局解决了问题。但是,我想知道我在这里做错了什么。

使用布局inflater,一切都很好。这是代码:

AlertDialog settingsDialog = new AlertDialog.Builder(this).
                    setTitle(R.string.settings)
                    .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            // Do sth here
                            dialogInterface.dismiss();
                        }
                    })
                    .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            dialogInterface.dismiss();
                        }
                    })
                    .create();

            View parentView = settingsDialog.getLayoutInflater().inflate(R.layout.layout_distance_settings, null);

            SeekBar distanceSB = (SeekBar) parentView.findViewById(R.id.sb_distance);
            distanceSB.setProgress(5);
            settingsDialog.setView(parentView);
            settingsDialog.show();

所以我的问题是:使用setView的正确方法是什么?如何访问用作setView?参数的布局的子视图

android xml android-layout android-alertdialog
1个回答
0
投票

您必须先扩充您的布局。为此,我们使用LayoutInflater类:

            LayoutInflater inflater = getActivity().getLayoutInflater();
            View dialogView=inflater.inflate(R.layout.layout_distance_settings,null);

并将其传递给setView()方法。

所以你的最终代码是:

LayoutInflater inflater = getActivity().getLayoutInflater();
                View dialogView=inflater.inflate(R.layout.layout_distance_settings,null);
AlertDialog settingsDialog = new AlertDialog.Builder(getActivity()).
                setTitle(R.string.settings)
                .setView(dialogView)
                .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        // Do sth here
                        dialogInterface.dismiss();
                    }
                })
                .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        dialogInterface.dismiss();
                    }
                })
                .create();

        SeekBar distanceSB = (SeekBar) settingsDialog.findViewById(R.id.sb_distance);
        distanceSB.setProgress(5);
        settingsDialog.show();
© www.soinside.com 2019 - 2024. All rights reserved.