两个窗格布局+ DrawerLayout:替换主要内容

时间:2014-03-29 13:26:10

标签: android android-layout android-fragments drawerlayout

我有一个DrawerLayout有三个部分:其中一个是像android工作室模板一样实现的两个窗格布局,所以两个片段,一个在另一个旁边,包含在LinearLayout中。这是布局:

<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">

<FrameLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:baselineAligned="false"
    android:orientation="vertical">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:baselineAligned="false"
        android:id="@+id/twoPaneLayut"
        android:divider="?android:attr/dividerHorizontal"
        android:showDividers="middle">

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

        <FrameLayout
            android:id="@+id/alarm_detail_container"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="2" />

    </LinearLayout>

</FrameLayout>

<ListView
    android:id="@+id/left_drawer"
    android:layout_width="@dimen/drawer_width"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:choiceMode="singleChoice"
    android:divider="@android:color/transparent"
    android:dividerHeight="0dp"
    android:background="#111" />

现在,其他部分由一个片段组成,所以我试图用FragmentTransaction替换外部FrameLayout的主要内容。

问题是内部LinearLayout显然没有被删除。

那么最好的策略是什么?以编程方式删除LinearLayout?将其可见性设置为GONE?

1 个答案:

答案 0 :(得分:2)

FrameLayout无法与weightSum一起使用,它的设计意味着填充您的布局。请尝试使用LinearLayoutRelativeLayout

其次,在交换所有内容时,您有几个选择。

选项1 使用一个FrameLayout,为您的2个面板布局创建一个包含2个片段的Fragment。是的,您可以在Fragment s内获得Fragment

在这种情况下,您的Activity布局看起来更像Google推荐的实施方式,而且您的片段布局将包含2个面板布局。

选项2 您可以将LinearLayout的其中一个替换为您的片段,并隐藏另一个LinearLayout。您没有理由只能为片段交换FrameLayout,您也应该能够为LinearLayout换出Fragment

选项3 DrawerLayout实施只是一个建议。您可以将抽屉的布局移动到片段中,并为不同的布局使用不同的Activity。要清楚,你的抽屉不是ListView,而是有一个片段。在这种情况下,将所有代码添加到辅助类中以便您可以轻松地重复使用它,您的抽屉视图将位于片段中,因此将更容易包含在多个活动中。

我已经包含了一个如何执行此操作的示例,因为您需要将导航抽屉片段包装在框架布局中并为框架布局提供layout_gravity属性,否则片段将填满整个屏幕而不是关闭。

activity_main.xml

<?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" >

<!-- The main content view -->

<FrameLayout
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
<!-- The navigation drawer -->

<FrameLayout
    android:id="@+id/nav_drawer_container"
    android:layout_gravity="start"
    android:layout_width="240dp"
    android:layout_height="match_parent" >

    <fragment
        android:id="@+id/nav_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        class="com.alimuzaffar.myapp.fragment.NavigationMenuFragment" />
</FrameLayout>

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

切换助手的代码可以类似于下面的setupNavigationDrawer()方法。只需从您希望拥有导航抽屉的任何活动的onCreate()中调用此代码即可。

public static void setupNavigationDrawer() {
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (mDrawerLayout != null) {
        // ActionBarDrawerToggle ties together the the proper interactions
        // between the sliding drawer and the action bar app icon
        mDrawerToggle = new ActionBarDrawerToggle(this, /* host Activity */
        mDrawerLayout, /* DrawerLayout object */
        R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */
        R.string.drawer_open, /* "open drawer" description for accessibility */
        R.string.drawer_close /* "close drawer" description for accessibility */
        ) {

            @Override
            public void onDrawerClosed(View view) {
                getSupportActionBar().setTitle(mTitle);
                supportInvalidateOptionsMenu(); // creates call
                                                                // to
                                                                // onPrepareOptionsMenu()
            }

            @Override
            public void onDrawerOpened(View drawerView) {
                getSupportActionBar().setTitle("");
                supportInvalidateOptionsMenu(); // creates call
                                                                // to
                                                                // onPrepareOptionsMenu()
            }
        };

        // set a custom shadow that overlays the main content when the drawer opens
        mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
        mDrawerLayout.setDrawerListener(mDrawerToggle);
    }

}