Android工具栏未从Backstack上的片段调用onOptionsItemSelected

我最近开始更新我的应用程序以使用 Android 5.0中引入的新工具栏组件,转而使用操作栏上的自定义视图.我按照指南在这里
http://antonioleiva.com/material-design-everywhere/添加工具栏工作正常.问题是,我正在使用导航结构,我有一个MainActivity,并通过将碎片添加到backstack来替换内容.我正在覆盖片段中的onCreateOptionsMenu和onoptionsItemSelected方法来设置工具栏中的菜单项,当我切换片段时图标会相应更改,并且在第一个片段上调用onoptionsItemSelected,但是当我将片段添加到片段时不调用堆栈中.甚至没有调用MainActivity中的onoptionsItemSelected函数,因此Activity不会使用该事件.我还尝试过更换片段而不将其添加到backstack,但仍未调用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 );
}

顶级片段菜单功能

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

在Backstack上的Fragment中的菜单功能

@Override
public void onCreateOptionsMenu( Menu 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 );
    }
}

解决方法

在更改其他片段时注意到问题,并注意到使用更简单的布局从片段调用onoptionsItemSelected.事实证明,出于某种原因 将ScrollView作为Fragment布局的顶级组件会干扰接收触摸事件的工具栏.通过将ScrollView包装在额外的RelativeLayout中(任何容器布局都可能有效),可以调用onoptionsItemSelected.我猜这与工具栏组件现在是视图层次结构的一部分有关 – 无法想到为什么为ScrollView添加包装器可以解决问题.如果有人能帮助解释这种奇怪的行为,我们将不胜感激.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...