NavigationView actionaBar onOptionsItemSelected R.id.home未触发

时间:2016-08-08 15:18:09

标签: android android-fragments navigation-drawer android-navigationview

我想在Android应用程序中实现up按钮,只有一个活动用不​​同的片段更改其内容。 我使用android studio提供的默认导航抽屉活动,其中我将frameLayout添加到content_main。 在我希望显示up botton的片段中,我在onCreateView方法中添加了这行代码:

ActionBar actionBar = ((AppCompatActivity)getActivity()).getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);

在onCreate方法中添加此行:

setHasOptionsMenu(true);

我添加了方法来捕捉它的点击:

 @Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
        Log.w("second fragment","clicked back");
        return true;
    }
    return super.onOptionsItemSelected(item);
}

在活动中我将onCreateOptionsMenu设置为:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

但点击它不会被触发。 我试图添加一个设置按钮,它被触发。 我已经阅读了很多关于此的问题,但我无法弄清楚如何解决它

3 个答案:

答案 0 :(得分:0)

应该在方法setHasOptionsMenu(true)中调用

onCreate(),让FragmentManager知道您的片段需要接收选项菜单回调。

答案 1 :(得分:0)

我相信您对ActionBarDrawerToggle使用this constructor,其中Toolbar作为参数。如果您使用此构造函数,则单击指示符时将不会调用onOptionsItemSelected。有关此问题的问题/答案,例如:

AppCompat v7 Toolbar onOptionsItemSelected not called

但是对我来说,它们都没有完美运行,所以我使用了特定于工具栏的构造函数,这里我的案例是解决方法。我在工具栏顶部放置了一个透明视图,只有当我显示后退按钮并且我自己处理点击时才会“看到”(在我的情况下调用onBackPressed())。

我知道这是一种黑客攻击,但它需要并为我工作。

<?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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/main_background">

            <android.support.design.widget.AppBarLayout
                android:id="@+id/appBar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:theme="@style/AppTheme.AppBarOverlay">

                <android.support.v7.widget.Toolbar
                    android:id="@+id/toolbar"
                    android:layout_width="match_parent"
                    android:layout_height="?attr/actionBarSize"
                    android:background="?attr/colorPrimary"
                    app:popupTheme="@style/AppTheme.PopupOverlay"/>

            </android.support.design.widget.AppBarLayout>

            <FrameLayout
                android:id="@+id/layoutMainContent"
                android:layout_below="@id/appBar"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>

        </RelativeLayout>

        <!-- The important view -->
        <View
            android:id="@+id/viewFakeBack"
            android:layout_width="56dp"
            android:layout_height="56dp"
            android:clickable="true"
            android:visibility="gone"/>

    </FrameLayout>

    <android.support.design.widget.NavigationView
        android:id="@+id/navigationView"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:menu="@menu/navigation_drawer"/>

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

答案 2 :(得分:-1)

尝试使用switch(...)case语句。

 @Override
public boolean onOptionsItemSelected(MenuItem item) {

    //this will make Hamburger button clickable.
    if (mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }

    //this will make the HomeAsUpIndicator button clickable.
    switch (item.getItemId()) {
        case android.R.id.home:
           Log.w("second fragment","clicked back");
           break;
    }
    return super.onOptionsItemSelected(item);
}

希望这会对你有所帮助。