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