有没有可能的方法在活动之间共享布局(部分)?例如,在我的应用程序中,所有活动都有类似的布局,顶部是长操作指示器(进度条,在没有执行任何操作时隐藏),底部用于显示错误。所有活动只有中间部分不同。见下图。
所以我的问题是,是否可以为我的应用中的所有活动重用公共布局(加载和错误部分)? (目前我不想因为某些原因使用片段来完成它)
也许布局资源应该是这样的:
layoutfolder
activity_common.xml
activity_one_content.xml
activity_two_content.xml
感谢
答案 0 :(得分:16)
您可以创建一个抽象的基础'所有活动扩展的活动,覆盖setContentView以合并基础和子活动布局。
这样您就可以处理基本活动中的所有加载/错误代码,只需在隐藏和显示子活动中的视图之间切换。
抽象活动:
public abstract class BaseActivity extends Activity {
protected RelativeLayout fullLayout;
protected FrameLayout subActivityContent;
@Override
public void setContentView(int layoutResID) {
fullLayout = (RelativeLayout) getLayoutInflater().inflate(R.layout.activity_base, null); // The base layout
subActivityContent = (FrameLayout) fullLayout.findViewById(R.id.content_frame); // The frame layout where the activity content is placed.
getLayoutInflater().inflate(layoutResID, subActivityContent, true); // Places the activity layout inside the activity content frame.
super.setContentView(fullLayout); // Sets the content view as the merged layouts.
}
}
布局文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- The main content view -->
<FrameLayout
android:id="@+id/loading_frame"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<!-- The main content view -->
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<FrameLayout
android:id="@+id/error_frame"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
答案 1 :(得分:4)
您可以在include
中使用XML
,包括布局代码中可重复使用的部分。
举个例子,这是我在我的应用中使用的Toolbar
的布局文件:
// /res/layout/component_toolbar.xml
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:taggr="http://schemas.android.com/apk/res-auto"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/primary"
android:minHeight="?attr/actionBarSize"
taggr:popupTheme="@style/ThemeOverlay.AppCompat.Light"
taggr:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
现在,如果我想在另一个Toolbar
中再次使用Activity
,那么这就是我要写的全部内容:
// /res/layout/whatever_layout_this_might_be.xml
<include layout="@layout/component_toolbar" />
请记住,这将仅复制布局 - 而不是所述小部件/组件的实际行为。
如果您想要实际复制所有方面(布局,行为),我担心Fragment
是唯一的方法。
答案 2 :(得分:0)
尽管API 13已弃用ActivityGroup,但如果您不想使用片段,那么这可能是您的最佳选择。
根据文档,ActivityGroup是:
包含并运行多个嵌入式活动的屏幕。
您可以找到教程here和here虽然上面提到的教程使用Tablayout,但您可以将其替换为XML中的常用布局。
第二种方法可能是Reuse the layout with include tag,在这种方法中,你可以在应用程序的任何地方重复使用曾经创建的公共布局。