我在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?
参数的布局的子视图
您必须先扩充您的布局。为此,我们使用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();