我尽最大努力开发一种聪明的方法来清理成堆的Blah blah = (Blah) this.findViewById(R.id.blah)
否则会污染我的小Activity的字段和onCreate()方法,并且这样做,我觉得我不应该使用setContentView ()但是getViewInflate()。inflate()用于XML中定义的每个View。
Activity.setContentView()
是一种语法糖,它对于XML上的每个视图实际上都在重复getViewInflate().inflate()
吗?我读了一些东西,好像它们是一样的。
如果我可以通过查看代码得到答案,请告诉我们。我检查了Activity.class,但只找到了注释。
答案 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);
您决定什么更适合您。希望这会有所帮助。