Android 工具栏不从 Backstack 上的 fragment 调用 onOptionsItemSelected

标签 android android-fragments android-toolbar

我最近开始更新我的应用程序以使用 Android 5.0 中引入的新工具栏组件,以支持在操作栏上使用自定义 View 。我按照这里的指南: http://antonioleiva.com/material-design-everywhere/并添加工具栏效果很好。问题是,我正在使用一个导航结构,其中有一个 MainActivity 并通过将 Fragments 添加到后台堆栈来替换内容。我正在覆盖 fragment 中的 onCreateOptionsMenu 和 onOptionsItemSelected 方法以设置工具栏中的菜单项,并且当我切换 fragment 时图标会适当更改并且在第一个 fragment 上调用 ​​onOptionsItemSelected,但在我将 fragment 添加到后栈。 MainActivity 中的 onOptionsItemSelected 函数甚至都没有被调用,因此事件没有被 Activity 使用。我也尝试过只替换 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 菜单功能:

@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 on backstack 中的菜单函数

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

最佳答案

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

关于Android 工具栏不从 Backstack 上的 fragment 调用 onOptionsItemSelected,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26530224/

相关文章:

android.support.v7.widget.Toolbar.getNavigationIcon() 返回 null

java - 在java Android中不断更新GUI

java - 检测 LibGdx 中文本点击的方法

java - 将自定义日期格式转换为 unixtime

java - 带有 id 的 RecyclerView 和 CoordinatorLayout 正在崩溃

android - 如何在折叠模式下隐藏工具栏并在正常模式下显示

android - 在 Play 商店中发布应用

android - 如何在 fragment 内实现 viewpager?

android - SupportFragmentManager 的 findFragmentById 始终返回 null

android - 当每个 fragment 都有工具栏时如何处理抽屉切换和工具栏向上