【发布时间】:2015-12-07 08:34:50
【问题描述】:
我使用DrawerLayout 来设置侧边菜单,并使用默认设置抽屉片段:
public void setUp(int fragmentId, DrawerLayout drawerLayout, Toolbar toolBar)
我在 MainActivity(它承载抽屉片段)内还有一个 FrameLayout。
我将片段动态地交易到这个容器中。
我想要做的是更改工具栏标题并在容器中有任何片段时显示后退按钮。否则显示打开抽屉的常用汉堡图标。
有没有办法我也可以将相同的 ActionBarDrawerToggle 用于返回堆栈。或者有没有办法可以在每个片段中使用一个工具栏,它有一个后退按钮和标题?
我尝试在每个片段中使用工具栏,但它看起来不太像默认操作栏(当然是因为片段应该有操作栏)。
我看到 Gmail 应用程序使用 ActionBarDrawerToggle 本身执行此操作(当出现新片段时,即打开邮件时,将其更改为后退按钮)。有人可以指出如何做到这一点。
代码:
活动布局:
<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">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
android:id="@+id/tool_bar"
layout="@layout/tool_bar" />
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/tool_bar" />
</RelativeLayout>
<fragment
android:id="@+id/fragment_navigation_drawer"
android:name="com.xxx.yyy.NavigationDrawerFragment"
android:layout_width="@dimen/navigation_drawer_width"
android:layout_height="match_parent"
android:layout_gravity="left"
tools:layout="@layout/fragment_navigation_drawer" />
</android.support.v4.widget.DrawerLayout>
创建活动:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setSupportActionBar(toolBar);
mNavigationDrawerFragment = (NavigationDrawerFragment)
getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer);
// Set up the drawer.
mNavigationDrawerFragment.setUp(
R.id.fragment_navigation_drawer,
(DrawerLayout) findViewById(R.id.drawer_layout), toolBar);
((DrawerLayout) findViewById(R.id.drawer_layout)).closeDrawer(GravityCompat.START);
}
Fragment的setUp方法:
/**
* Users of this fragment must call this method to set up the navigation drawer interactions.
*
* @param fragmentId The android:id of this fragment in its activity's layout.
* @param drawerLayout The DrawerLayout containing this fragment's UI.
* @param toolBar
*/
public void setUp(int fragmentId, DrawerLayout drawerLayout, Toolbar toolBar) {
mFragmentContainerView = getActivity().findViewById(fragmentId);
mDrawerLayout = drawerLayout;
// set a custom shadow that overlays the main content when the drawer opens
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
// set up the drawer's list view with items and click listener
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
// ActionBarDrawerToggle ties together the the proper interactions
// between the navigation drawer and the action bar app icon.
mDrawerToggle = new ActionBarDrawerToggle(
getActivity(),
mDrawerLayout,
R.string.navigation_drawer_open,
R.string.navigation_drawer_close
) {
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
if (!isAdded()) {
return;
}
getActivity().supportInvalidateOptionsMenu(); // calls onPrepareOptionsMenu()
}
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
if (!isAdded()) {
return;
}
getActivity().supportInvalidateOptionsMenu(); // calls onPrepareOptionsMenu()
}
};
// Defer code dependent on restoration of previous instance state.
mDrawerLayout.post(new Runnable() {
@Override
public void run() {
mDrawerToggle.syncState();
}
});
mDrawerLayout.setDrawerListener(mDrawerToggle);
}
【问题讨论】:
-
我可以理解您的情况,但您能否发布一些代码,以便我们建议您根据您的代码进行更改..
-
@Droidwala 我添加了相关代码。
标签: android