首选将哪种参数放入AlertDialog.Builder.setView()

时间:2019-06-08 07:41:38

标签: android

我正在使用DialogFragment的onCreateDialog显示日期选择器,并且为日期选择器创建了一个xml文件。

我应该:

    直接使用R.layout.xml_name
  1. 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();
    }
    
  2. 使用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

使用只是一种不同的偏好吗?哪个是更好的做法?

2 个答案:

答案 0 :(得分:0)

您提到的两件事完全相同。

在内部,当您使用setView(int resourceId)(您的情况1)时,您传递给setView的Layout在内部是Inflated并发送到setView(View view)函数。

因此,通过使用案例2,您正在增加自己的工作。

但是,为什么要使用案例2?因此,您可以传递两种上下文

LayoutInflater.from(context)

现在,这是什么意思?

  1. 如果将Activity上下文传递给LayoutInflater,这意味着您将使用应用于AlertDialog中活动的相同主题。

  2. 但是,如果您使用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);