Android:setContentView()== getViewInflate()。inflate()?

时间:2012-07-11 09:44:40

标签: android layout-inflater

我尽最大努力开发一种聪明的方法来清理成堆的Blah blah = (Blah) this.findViewById(R.id.blah)否则会污染我的小Activity的字段和onCreate()方法,并且这样做,我觉得我不应该使用setContentView ()但是getViewInflate()。inflate()用于XML中定义的每个View。

Activity.setContentView()是一种语法糖,它对于XML上的每个视图实际上都在重复getViewInflate().inflate()吗?我读了一些东西,好像它们是一样的。

如果我可以通过查看代码得到答案,请告诉我们。我检查了Activity.class,但只找到了注释。

3 个答案:

答案 0 :(得分:2)

Activity上的setContentView实际上调用了活动使用的Window上的setContentView,它本身不仅仅是对布局进行充气。

您可以做的是使用反射将视图映射到类字段。您可以下载执行此操作的实用程序类on Github

它将解析布局中声明的所有视图,然后尝试在R.id类中找到与id对应的名称。然后它将尝试在目标对象中找到具有相同名称的字段,并使用相应的视图进行设置。

例如,如果你有这样的布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
</LinearLayout>

它会自动将其映射到您活动中的textView1字段。

答案 1 :(得分:0)

我发布了我糟糕的研究报告。总而言之,Activity.setContentView()委托PhoneWindow.setContentView()Window)的唯一具体类,其中LayoutInflater.inflate()被调用,所以说“setContentView() == {{1}我想,“不是太过分了。”

ViewInflate().inflate()

答案 2 :(得分:-1)

其实你是对的,有两种方法可以达到同样的目的:

1)setContentView(R.layout.layout);

2)

LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
View v = inflater.inflate(R.layout.layout, null);
setContentView(v);

您决定什么更适合您。希望这会有所帮助。