Панель действий NavigationView onOptionsItemSelected R.id.home не запущена

Я хочу реализовать кнопку «вверх» в приложении для Android только с одним действием, которое меняет свое содержимое с другим фрагментом. Я использовал действие навигационного ящика по умолчанию, предоставленное студией Android, где я добавил frameLayout в content_main. Во фрагменте, где я хочу, чтобы отображалась кнопка вверх, я добавил эту строку кода в метод 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;
}

но щелчок по нему не срабатывает. Я попытался добавить кнопку настройки, и она сработала. Я уже прочитал много вопросов об этом, но я не могу понять, как это решить


person pool    schedule 08.08.2016    source источник


Ответы (3)


setHasOptionsMenu(true) следует вызывать в методе onCreate(), чтобы FragmentManager знал, что ваш фрагмент должен получать обратные вызовы меню параметров.

person li2    schedule 09.08.2016
comment
Я поставил это, но я забыл добавить в вопрос - person pool; 09.08.2016
comment
Как вы реализуете onCreateOptionsMenu? - person li2; 09.08.2016
comment
Кажется, все в порядке: вы вызвали setHasOptionsMenu, вы используете android.R.id.home вместо R.id.home, onCreateOptionsMenu в порядке. Понятия не имею. орз.... - person li2; 09.08.2016
comment
уже пробовал и то, и другое. Странно, что даже в активности onOptionsItemSelected на R.id.home не запускается - person pool; 09.08.2016

Я полагаю, что вы используете это конструктор для ActionBarDrawerToggle, который принимает Toolbar в качестве параметра. Если вы используете этот конструктор, onOptionsItemSelected не будет вызываться, если вы нажмете на индикатор. Есть вопросы/ответы по этой проблеме, например:

Панель инструментов AppCompat v7 onOptionsItemSelected не вызывается

Но для меня ни один из них не работал идеально, поэтому я использовал конструктор для панели инструментов, и вот это обходной путь для моего случая. Я помещаю прозрачное представление поверх панели инструментов, которое «видимо» только тогда, когда я показываю кнопку «Назад» и сам обрабатываю щелчок (вызывая 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>
person Tamás Cseh    schedule 05.09.2016
comment
Спасибо, в конце концов я нашел другой обходной путь из разных вопросов, потому что и для меня тоже не работает - person pool; 09.09.2016

Попробуйте использовать оператор case switch(...).

 @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);
}

Надеюсь, что это поможет вам.

person TheHound.developer    schedule 09.08.2016
comment
Извините, в моем случае целый onOptionsItemSelected не вызывается. - person CoolMind; 01.12.2016
comment
Это не имеет никакого смысла. Почему переключатель должен иметь какое-то отношение к проблеме? - person The incredible Jan; 07.02.2018