我遇到这种情况:启动应用程序时,显示的第一个片段(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实例?这种方法是否可行?
任何提示都非常感谢!
谢谢, 肖恩
答案 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>