在Android中重用父布局

时间:2016-02-12 22:49:47

标签: android android-layout

我的应用程序由多个活动组成,它们都有一个共同的布局,即它们是抽屉布局,有一个工具栏,但它们有不同的主要内容。具体来说,他们的完整布局如下

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:id="@+id/relative_layout"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

        <android.support.v7.widget.Toolbar
            android:id="@+id/action_bar"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            />

        .......main content, this is different for each activity..........

    </RelativeLayout>
</android.support.v4.widget.DrawerLayout>

由于共享组件是在“父级别”定义的,因此我不确定如何构建这些布局,以便通用布局仅定义一次。是否有可能实现这一目标?感谢。

2 个答案:

答案 0 :(得分:1)

两个选项:

1。 ViewStub

使用ViewStub定义主布局,您将拥有不同的子布局。

  

ViewStub是一个不可见的,零大小的视图,可以懒得使用   在运行时膨胀布局资源。当ViewStub可见时,   或者,当调用inflate()时,布局资源会膨胀。该   ViewStub然后在其父级中使用膨胀的View或替换自身   观。

在每个Activity中设置相同的布局,然后将特定的子布局膨胀到ViewStub上。

2。片段

如果您想避免在单个活动中使用大量代码,可能需要考虑使用Fragments

其他一些指导您的主题:

答案 1 :(得分:0)

是的,可以使用Fragment。首先,对于此结构,您需要在FrameLayout中定义activity_main.xml。这个framelayout将随着时间的推移被片段的内容所取代。

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/container_toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <include
            android:id="@+id/toolbar"
            layout="@layout/toolbar" />
    </LinearLayout>

    <FrameLayout
        android:id="@+id/container_body"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1" >
    </FrameLayout>

  </LinearLayout>

  <fragment
    android:id="@+id/fragment_navigation_drawer"
    android:name="com.safallwa.zahan.oreader.FragmentDrawer"
    android:layout_width="@dimen/nav_drawer_width"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    app:layout="@layout/fragment_navigation_drawer"
    tools:layout="@layout/fragment_navigation_drawer" />
</android.support.v4.widget.DrawerLayout> 

然后,您可以根据需要创建布局,并将类扩展为Fragment。将这些新布局设置为Fragment类的contentView。现在,这些片段可以取代FrameLayout activity_main。假设我们有一个Framgent类名First_Fragment.Java,那么我们可以通过以下代码替换activity_main framelayout来显示该片段

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.container_body, fragment);//container_body is the id of the framelayout
        fragmentTransaction.commit();

对于带导航抽屉的全功能示例,我们也可以按照以下链接

http://www.codedisect.com/?p=134