Android工具栏导航后退按钮回调从不调用

时间:2016-08-04 10:47:29

标签: android android-fragments android-toolbar android-navigation

我知道有很多问题需要回答,但我找不到任何工作。

我有一个活动(MainActivity)负责显示不同的片段。此外,在活动中,我有导航抽屉,我只在一个片段上显示(它隐藏在其他片段上)。

问题是工具栏导航回调永远不会被调用。显示后退按钮,但单击它不会执行任何操作。另外(我不知道它是否有任何区别)但是用户从另一个片段中获取该片段,其中我执行与此相同的操作,除了导航后退按钮被隐藏。

活动的XML是:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    android:id="@+id/drawer_layout"
    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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <include
            android:id="@+id/main_toolbar"
            layout="@layout/toolbar"/>

        <FrameLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

    </LinearLayout>

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/drawer_header"
        app:menu="@menu/activity_main_drawer"/>
</android.support.v4.widget.DrawerLayout>

包含的工具栏:

<?xml version="1.0" encoding="utf-8"?>
    <android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/colorPrimary"
    app:theme="@style/Base.ThemeOverlay.AppCompat.Dark.ActionBar"/>

现在,在活动中我设置了一个工具栏,并在其后退按钮上放置了一个监听器:

setSupportActionBar(mainToolbar);
setTitle(getResources().getString("Some title"));
mainToolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            onBackPressed();
        }
    });

在我需要后退按钮的特定片段中,我这样做是为了显示它:

if (this.context.getSupportActionBar() != null) {
    this.context.getSupportActionBar().setTitle("Fragment title"));          
    this.context.getSupportActionBar().setDisplayHomeAsUpEnabled(true);   
    this.context.getSupportActionBar().setDisplayShowHomeEnabled(true);
}

并且,因为我不想使用/显示导航抽屉,所以在片段中我调用执行此代码的活动中定义的方法:

drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
drawerToggle.setDrawerIndicatorEnabled(false);

1 个答案:

答案 0 :(得分:0)

在要显示后退按钮的特定片段上,只需将该片段添加到backstack

将此BackStack更改侦听器添加到Activity

  @Override
public void onBackStackChanged() {
    if (getSupportFragmentManager().getBackStackEntryCount() != 0) 
        mToolbar.setNavigationIcon(R.drawable.ic_action_back);
        mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
            }
        });
    }
}

要添加到backStack,您可以使用该行

如果你将true传递给addtoback堆栈,那么它将添加和后台堆栈。

public void changeFragment(Fragment fragment, boolean addtobackstack) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.setCustomAnimations(R.anim.fragment_enter, R.anim.fragment_exit);
    fragmentTransaction.replace(R.id.fragment_container, fragment, MainActivity.TAG);
    if (addtobackstack)
        fragmentTransaction.addToBackStack(null);


    fragmentTransaction.commit();
}