我正在使用DialogFragment的onCreateDialog显示日期选择器,并且为日期选择器创建了一个xml文件。
我应该:
setView
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
.setView(R.layout.dialog_date)
.setTitle(R.string.date_picker_title)
.setPositiveButton(android.R.string.ok,null)
.create();
}
使用View对象作为参数的setView,使用LayoutInflater.inflate()
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
View v = LayoutInflater.from(getActivity())
.inflate(R.layout.dialog_date,null);
return new AlertDialog.Builder(getActivity())
.setView(v)
.setTitle(R.string.date_picker_title)
.setPositiveButton(android.R.string.ok,null)
.create();
}
两者都显示相同的结果,我在书中看到了选项2
使用只是一种不同的偏好吗?哪个是更好的做法?
答案 0 :(得分:0)
您提到的两件事完全相同。
在内部,当您使用setView(int resourceId)
(您的情况1)时,您传递给setView的Layout在内部是Inflated
并发送到setView(View view)
函数。
因此,通过使用案例2,您正在增加自己的工作。
但是,为什么要使用案例2?因此,您可以传递两种上下文
LayoutInflater.from(context)
现在,这是什么意思?
如果将Activity
上下文传递给LayoutInflater
,这意味着您将使用应用于AlertDialog中活动的相同主题。
但是,如果您使用getContext()
,则文档说明:
注意:为确保样式一致,应放大自定义视图 或使用通过获取的警报对话框的主题上下文构造 getContext()。
因此,如果要在所有对话框中保持一致,并且将主题应用于AlertDialog
,它将应用于您手动放大的对话框。
您可以在链接上查看有关AlertDialog.Builder的更多信息。
答案 1 :(得分:0)
两者在不同情况下都很好-
情况1-,如果您只想显示一条消息,则选项1 很好,因为不需要额外的精力来增加布局。
情况2-,如果您想通过对话框执行某些操作,则选项2 是最好的。
例如-假设您要使用按钮关闭布局 dialog_date.xml 文件中的对话框,而不是执行操作使用该按钮,您需要给 dialog_date.xml 充气以找到按钮的 id 。
这样-
View v = LayoutInflater.from(getActivity())
.inflate(R.layout.dialog_date,null);
然后
Button btnCloseDialog= v.findViewById(R.id.buttonId);