7

私は最近、Android 5.0 で導入された新しい Toolbar コンポーネントを使用するようにアプリを更新し始め、アクション バーでカスタム ビューを使用するようにしました。ここのガイドに従いました: http://antonioleiva.com/material-design-everywhere/ツールバーの追加は正常に機能します。問題は、MainActivity があるナビゲーション構造を使用しており、フラグメントをバックスタックに追加してコンテンツを置き換えることです。Fragments の onCreateOptionsMenu メソッドと onOptionsItemSelected メソッドをオーバーライドしてツールバーのメニュー項目を設定しています。Fragments を切り替えるとアイコンが適切に変更され、最初の Fragment で onOptionsItemSelected が呼び出されますが、Fragment をバックスタック。MainActivity の onOptionsItemSelected 関数は呼び出されないため、イベントはアクティビティによって消費されません。また、バックスタックに追加せずに Fragment を置き換えようとしましたが、onOptionsItemSelected はまだ呼び出されていません。コンテンツ Fragment を変更すると onOptionsItemSelected が呼び出されるようにするには、何が欠けていますか? 関連するコードを以下に掲載します。

アプリのテーマ:

<style name="AppThemeLight" parent="@style/Theme.AppCompat.Light">
    <item name="actionMenuTextColor">@color/white</item>
    <item name="android:windowDisablePreview">true</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowActionBarOverlay">true</item>
    <item name="android:windowActionBar">false</item>
</style>

MainActivity にツールバーを追加する:

Toolbar toolbar = (Toolbar)findViewById( R.id.toolbar );
if (toolbar != null) {
    setSupportActionBar( toolbar );
    getSupportActionBar().setDisplayHomeAsUpEnabled( true );
    toolbar.setNavigationIcon( R.drawable.toolbar_icon_menu );
}

MainActivity のメニュー機能:

@Override
public boolean onCreateOptionsMenu( Menu menu ) {
    Log.v( "Main", "onCreateOptionsMenu" );
    return super.onCreateOptionsMenu( menu );
}

@Override
public boolean onOptionsItemSelected( MenuItem item ) {
    Log.v( "Main", "onOptionsItemSelected" );
    return super.onOptionsItemSelected( item );
}

最上位の Fragment Menu 関数:

@Override
public void onCreateOptionsMenu( Menu menu, MenuInflater inflater ) {
    super.onCreateOptionsMenu( menu, inflater );
    inflater.inflate( R.menu.main_looks, menu );
}

@Override
public boolean onOptionsItemSelected( MenuItem item ) {
    switch (item.getItemId()) {
        case R.id.miOptions:
            onOptions();
            return true;
        default:
            return super.onOptionsItemSelected( item );
    }
}

バックスタックの Fragment のメニュー機能

@Override
public void onCreateOptionsMenu( Menu menu, MenuInflater inflater ) {
    super.onCreateOptionsMenu( menu, inflater );
    inflater.inflate( R.menu.user, menu );
}

@Override
public boolean onOptionsItemSelected( MenuItem item ) {
    Log.v( "User", "onOptionsItemSelected" );
    switch (item.getItemId()) {
        case R.id.miUserShare:
            onShareUser();
            return true;
        case R.id.miUserEdit:
            onEditUserProfile();
            return true;
        default:
            return super.onOptionsItemSelected( item );
    }
}
4

2 に答える 2

4

フラグメントの OnCreate で setHasOptionsMenu(true) を呼び出すことを忘れないでください

于 2014-10-23T15:02:23.360 に答える