【问题标题】:Android: setContentView() == getViewInflate().inflate()?Android:setContentView() == getViewInflate().inflate()?
【发布时间】:2012-07-11 09:44:39
【问题描述】:

我尽我所能开发一种聪明的方法来清除成堆的Blah blah = (Blah) this.findViewById(R.id.blah),否则会污染我的小Activity的字段和onCreate()方法,为此,我觉得我不应该使用setContentView()但 getViewInflate().inflate() 用于 XML 中定义的每个视图。

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

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

【问题讨论】:

标签: android layout-inflater


【解决方案1】:

Activity 上的 setContentView 实际上调用了 Activity 使用的 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 字段。

【讨论】:

  • 谢谢。他们真的很有趣。对我来说一个问题是它的性能,也许是因为它调用了一种方法来搜索属于ViewGroupandroid.R.id.content 的每个View 。也许我会避免使用setContentView() 并定义我自己的方法,这样我就可以在每次执行ViewInflate.inflate() 时将View 分配给变量。
【解决方案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();
        }
    }
}

【讨论】:

    【解决方案3】:

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

    1) setContentView(R.layout.layout);

    2)

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

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

    【讨论】:

    • 抱歉我的问题很模糊。我怀疑,在setContentView()方法的定义中,实际上使用了ViewInflate.inflate(),想知道是不是这样。我是否应该详细说明我的问题,也许...
    猜你喜欢
    • 2014-05-19
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 2020-10-11
    • 2013-11-30
    • 2021-09-27
    相关资源
    最近更新 更多