setContentView(View view) 和 setContentView(int layoutResId) 的区别

Differences between setContentView(View view) and setContentView(int layoutResId)

我的 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),我该如何实现相同的目的?

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

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>

两种方法的说明:

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(视图视图,ViewGroup.LayoutParams参数)

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 的那个首先对其进行膨胀,然后将其添加到 activity 根视图。

带有 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);
}

Activityclass中有两个抽象方法,您可以在BaseActivity中实现。

public abstract void setContentView(View view);

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

实施后,您可以在 MainActivity

中使用这些方法

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

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

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