setContentView(View视图)和setContentView(int layoutResId)

时间:2016-02-01 09:32:07

标签: android android-inflate setcontentview

我的MainActivity扩展了BaseActivity。在我的BaseActivity中,我覆盖了setContentView(int layoutResId)(请参阅下文),以便当我的MainActivity调用setContentView(R.layout.activity_main)时,BaseActivity中的视图组件 - activityContainer将包含R.layout.activity_main作为其子级在调用方法getLayoutInflater().inflate(layoutResID, activityContainer, true);之后。如果我想在BaseActivity中覆盖setContentView(View view)而不是setContentView(int layoutResId),我该如何实现同样的目标?

编辑:这两种方法有什么区别?

Inside BaseActivity:

@Override
public void setContentView(int layoutResId) {
        RelativeLayout baseActivity = (RelativeLayout) getLayoutInflater()
            .inflate(R.layout.activity_base, null);

        FrameLayout activityContainer = (FrameLayout) baseActivity
            .findViewById(R.id.activity_container);

        getLayoutInflater().inflate(layoutResID, activityContainer, true);
}

activity_base.xml:

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

    <FrameLayout
        android:id="@+id/activity_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    .... other components
</RelativeLayout>

3 个答案:

答案 0 :(得分:2)

两种方法的描述:

setContentView(int layoutResID)

Set the activity content from a layout resource.
The resource will be inflated, adding all top-level views to the activity.

setContentView(View view,ViewGroup.LayoutParams params)

Set the activity content to an explicit view.
This view is placed directly into the activity's view hierarchy.
It can itself be a complex view hierarchy.

基本上不同之处在于,期望布局ID的布局ID首先将其膨胀,然后将其添加到活动根视图中。

具有View的那个没有做任何膨胀,它只是立即使用给定的LayoutParams将其添加到根视图。

总而言之,您的重写方法将是这样的:

@Override
public void setContentView(View view, ViewGroup.LayoutParams params) {
    RelativeLayout baseActivity = (RelativeLayout) getLayoutInflater()
        .inflate(R.layout.activity_base, null);
    FrameLayout activityContainer = (FrameLayout) baseActivity
        .findViewById(R.id.activity_container);
    activityContainer.addView(view, params);
}

答案 1 :(得分:1)

Activity课程中有两种抽象方法可以在BaseActivity中实现。

public abstract void setContentView(View view);

public abstract void setContentView(View view, ViewGroup.LayoutParams params);

实施后,您可以在MainActivity

中使用这些方法

答案 2 :(得分:0)

我认为不同的是(View layoutResID)(View view)

使用方法setContentView(int layoutResID):您可以从布局资源设置活动内容。

使用方法setContentView(View view):您可以从视图设置活动内容(您可以从布局资源获取此视图,也可以通过编程方式创建)