在API 21及更高版本的

时间:2017-06-20 09:25:28

标签: android alertdialog dialogfragment

Android Studio将我推荐给https://possiblemobile.com/2013/05/layout-inflation-as-intended/,以获取有关布局膨胀过程以及如何修复“避免将null作为根视图传递”警告的信息。

建议始终将有效父级传递给inflate(),其中一个着名的例外是具有自定义视图的AlertDialogs,因为在我们调用AlertDialog.Builder.setView()时“父级”不可用。

从API 21开始,可以使用AlertDialog.Builder.setView()的第二个实现,这使我们能够传递布局ID而不是手动夸大的布局。问题是您无法通过在AlertDialog.Builder.create()创建的AlertDialog上调用findViewById()来访问布局成员。 findViewById()始终返回null,直到您在构建器返回的对话框上手动调用AlertDialog.create()。这似乎有效,但我不确定其含义。 create()会被多次调用(由我自己手动,稍后由DialogFragment调用)?我是否会导致重复的初始化工作,这会对性能和/或内存使用产生负面影响?

基本上,在最终向用户显示对话框之前,当您需要访问自定义布局的成员时,自从API 21开始在DialogFragment.onCreateDialog()中扩展自定义AlertDialog布局的推荐方法是什么?

A)

View v = getActivity().getLayoutInflater().inflate(R.layout.layout_id, null);
AlertDialog ad = (new AlertDialog.Builder(getActivity()))
    .setView(v)
    .create();
v.findViewById(R.id.view_id).doSomething();

b)中

AlertDialog ad = (new AlertDialog.Builder(getActivity()))
    .setView(R.layout.layout_id)
    .create();
ad.create();
ad.findViewById(R.id.view_id).doSomething();

0 个答案:

没有答案