【问题标题】:Use the ActionBarDrawerToggle for backstack as well也将 ActionBarDrawerToggle 用于 backstack
【发布时间】: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


【解决方案1】:

这就是我通常在上面类似的场景中所做的事情

第 1 步
使工具栏成为您的主要活动的一部分,如下所示:[您已经完成了!]

<DrawerLayout>
   <LinearLayout>
      <Toolbar/>
      <FrameLayout/>
   </LinearLayout>
<NavigationView>

第 2 步
在主活动中填充片段时,禁用 ActionBarDrawerToggle 上的抽屉指示器,如下所示:

toggle.setDrawerIndicatorEnabled(false);   //disables hamburger icon
getSupportFragmentManager().beginTransaction()
                           .replace(R.id.content,frag)
                           .addToBackStack(null)
                           .commit();

第 3 步
在 Fragment 生命周期方法中更改 Fragment 的标题,如下所示:

  @Override
    public void onActivityCreated(Bundle savedInstance){
     super.onActivityCreated(savedInstance);
    ((ActionBarActivity or AppCompatActivity)getActivity).getSupportActionBar().setTitle("Name of your fragment"); 
   }

第 4 步: 您可以在片段类中处理后退按钮单击,如下所示:

@Override
public void onOptionsItemSelected(MenuItem item){
 switch(item.getItemId()){
       case android.R.id.home://this will handle back navigation click
           getActivity().onBackPressed();
           break;
       }
  return super.onOptionsItemSelected(item);
  }

希望对您有所帮助!如有任何疑问,请在下面发表评论..

【讨论】:

  • toggle.setDrawerIndicatorEnabled(false); 会让汉堡消失并显示后退按钮吗?如何处理单击的此后退按钮?
  • 是的,这将删除汉堡图标..返回按钮单击处理添加到答案
  • 好的。我认为在onActivityCreated 中设置标题在返回堆栈时不起作用。
  • @Housefly 抱歉,我没有收到您的上述评论。您能解释一下吗?
  • 返回fragment的backstack时,它们的onActivityCreated不会被再次调用,也就是说action bar的标题会保持上次添加的fragment中设置的标题,而不是改成什么目前处于前台。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-05
  • 1970-01-01
  • 2012-09-24
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多