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);
}
Activity
class中有两个抽象方法,您可以在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 内容(您可以从布局资源中获取此视图,也可以通过编程方式创建)
我的 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);
}
Activity
class中有两个抽象方法,您可以在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 内容(您可以从布局资源中获取此视图,也可以通过编程方式创建)