4

我尽我最大的努力开发一种聪明的方法来清理成堆的Blah blah = (Blah) this.findViewById(R.id.blah)否则会污染场地和我的小活动的 onCreate() 方法,为此,我觉得我不应该使用 setContentView() 而是使用 getViewInflate().inflate () 用于 XML 中定义的每个视图。

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

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

4

3 回答 3

2

我正在发布我糟糕的研究。总之,Activity.setContentView()委托PhoneWindow.setContentView()(唯一的具体类Window)在其中LayoutInflater.inflate()被调用,所以说“ setContentView()== ViewInflate().inflate()”并不过分,我猜。

public class Activity extends ContextThemeWrapper{

    private Window mWindow;

    public void setContentView(int layoutResID) {
        getWindow().setContentView(layoutResID);
        initActionBar();
    }

    public Window getWindow() {
        return mWindow;
    }
}



public class PhoneWindow extends Window {

    private LayoutInflater mLayoutInflater;

    @Override
    public void setContentView(int layoutResID) {
        if (mContentParent == null) {
            installDecor();
        } else {
            mContentParent.removeAllViews();
        }
        **mLayoutInflater.inflate(layoutResID, mContentParent);**
        final Callback cb = getCallback();
        if (cb != null) {
            cb.onContentChanged();
        }
    }
}
于 2012-07-12T11:05:56.513 回答
2

你的 Activity 上的 setContentView 实际上调用了 Activity 使用的 Window 上的 setContentView,它本身所做的不仅仅是膨胀布局。

您可以做的是使用反射将视图映射到类字段。您可以在 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 字段。

于 2012-07-11T10:25:20.327 回答
0

其实你是对的,有两种方法可以实现相同的目标:

1)setContentView(R.layout.layout);

2)

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

你决定什么更适合你。希望这可以帮助。

于 2012-07-11T09:59:14.350 回答