Android工具栏未调用OnOptionItemSelected(从Backstack上的片段中选择)

Android工具栏未调用OnOptionItemSelected(从Backstack上的片段中选择),android,android-fragments,android-toolbar,Android,Android Fragments,Android Toolbar,我最近开始更新我的应用程序,使用Android 5.0中引入的新工具栏组件,支持在操作栏上使用自定义视图。我跟随导游来到这里: 添加工具栏也很好。问题是,我使用的是一个导航结构,其中我有一个MainActivity,并通过在backbackback上添加片段来替换内容。我正在覆盖片段中的onCreateOptions菜单和onOptionItemSelected方法,以设置工具栏中的菜单项,当我切换片段时,图标会相应更改,并且在第一个片段上调用onOptionItemSelected,但在后台添

我最近开始更新我的应用程序,使用Android 5.0中引入的新工具栏组件,支持在操作栏上使用自定义视图。我跟随导游来到这里: 添加工具栏也很好。问题是,我使用的是一个导航结构,其中我有一个MainActivity,并通过在backbackback上添加片段来替换内容。我正在覆盖片段中的onCreateOptions菜单和onOptionItemSelected方法,以设置工具栏中的菜单项,当我切换片段时,图标会相应更改,并且在第一个片段上调用onOptionItemSelected,但在后台添加片段时不会调用。MainActivity中的onOptionsItemSelected函数甚至没有被调用,因此该活动没有使用该事件。我也尝试过只替换片段而不将其添加到backbackback,但是仍然没有调用onOptionsItemSelected。更改内容片段后,我缺少什么来获取要调用的OnOptions ItemSelected?相关代码发布在下面

应用程序主题:

<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 );
}
@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 );
    }
}
Backback上片段中的菜单函数

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

不要忘记在片段的OnCreate中调用setHasOptions菜单(true)

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

我说过,图标显示正确,但没有调用OnOptions ItemSelected。我找到的大多数答案都建议使用ActionBarDrawerToggle,但我没有抽屉,所以这个解决方案似乎没有必要。这解决了我的问题。我有一个类似的问题,但我发现了真正的错误。用相对论来解决它。你并没有解决它。出现的情况是,scrollview覆盖在工具栏顶部,这就是为什么无法调用图标的原因。他们被封锁了。工具栏不会像操作栏一样覆盖在视图顶部。这本身就是一种观点。要解决这个问题,只需在工具栏上添加一个id,然后在scrollview中添加android:layout_=“@id/Toolbar”。