动态更改抽屉布局

时间:2016-05-25 22:01:42

标签: android drawerlayout

我遇到这种情况:启动应用程序时,显示的第一个片段(A)有一些用户列表。单击用户时,将显示另一个片段(B),并且每个用户的抽屉菜单将一起不同。

正如您所看到的,我无法在启动应用程序(主要活动或启动器)时设置DrawerLayout,因为我还没有listView的数据,但是在点击时必须设置它应用程序完成启动后,片段A列表中的用户(当我可以检索抽屉菜单的listView的数据时,由xml文件中的id:fragment_drawer指示)。

这是" MainActivity"的xml文件:

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <!-- The main content view -->
    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    <!-- The navigation drawer, listView is inside MyDrawerFragment's layout-->
    <fragment android:id="@+id/fragment_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:name="mypackage.com.MyDrawerFragment"
        tools:layout="@layout/drawer_layout" />
</android.support.v4.widget.DrawerLayout>

如何实现片段B中的目标?这在片段B中是否可以实现?

如果不能在片段B中执行此操作,我打算启动第二个活动,比如Activity2,并且上面的xml布局文件将应用于此新活动,当单击片段A中的用户时,我只是一直在做这个:通过调用finish()关闭现有的Acitvity2并使用抽屉菜单的新数据创建一个新的Activity2实例?这种方法是否可行?

任何提示都非常感谢!

谢谢, 肖恩

1 个答案:

答案 0 :(得分:0)

我必须做一个应用程序,我必须使用4个片段和一个ViewPager进行活动,其中只有2个我会打开一个不同的抽屉。

Activity的布局必须包含DrawerLayout * ,但由于Drawer本身取决于我所在的片段,我认为它应该是片段,负责渲染(或不抽屉。

* 如果活动不包含DrawerLayout,则不会显示填充整个屏幕!

我做了类似的事情,虽然确实需要一些重构和清理:)

研究Fragment负责渲染Drawer的想法,但是Activity是可以访问它的Activity,我创建了两个接口来传递Fragment和Activity:

/** 
 * should be implemented by any fragment interested in communicating 
 * with a {@link FragmentListener} Activity
 */
public interface ActivityListener {
    /**
     * called from {@link FragmentListener} requestOpenDrawer
     * the fragment is in charge of rendering its drawer's layout
     */
    public void renderDrawer(DrawerLayout mDrawerLayout, 
                        NavigationView viewById, Activity activity);
}

-

/** 
 * used to communicate FROM fragments, to its parent Activity
 * implemented by {@link MainTabbedActivity}
 */
public interface FragmentListener {
    /**
     * call from a fragment to request opening the drawer
     * note that if the drawer isn't opened by the activity, 
     * it wouldn't cover the whole screen
     */
    void requestOpenDrawer(Fragment requester);

    void requestCloseDrawer();

    DrawerLayout getDrawerLayout();
}

实施

@Override
public void requestOpenDrawer(Fragment requester) {
    mDrawerLayout.openDrawer(Gravity.RIGHT); //Edit Gravity.End need API 14
    if (requester instanceof ActivityListener) {
        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);

        //let fragment render the drawer
        ((ActivityListener) requester).renderDrawer(mDrawerLayout, navigationView, this);
    }
}

-

@Override
public void renderDrawer(DrawerLayout mDrawerLayout, NavigationView viewById, Activity activity) {
   View child = activity.getLayoutInflater().inflate(R.layout.credit_fragment_drawer, null);

    navigationView.addView(child);
}

布局

Activity布局和Fragments布局都没有比标准Drawer实现更多的东西:

使用抽屉的活动布局:

<?xml version="1.0" encoding="utf-8"?>
<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/main_tabbed_drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:openDrawer="right">

    <include
        layout="@layout/activity_main_tabbed_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="right"
        android:fitsSystemWindows="true" />

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

其中activity_main_tabbed_content是您要在活动中放入的内容。

片段实际上没有任何东西,只有一个普通的片段。 例如:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- whatever views you want -->
</RelativeLayout>