【发布时间】:2014-01-22 16:23:14
【问题描述】:
TLDR:为片段添加菜单项会导致 onTabSelected 被无限调用。
我正在开发适用于 Android 4.0+ 的应用,但遇到了问题。我目前正在使用带有标签的ActionBar,效果很好。当我单击一个选项卡时,方法onTabSelected(Tab, FragmentTransaction) 被调用一次,然后我切换屏幕上显示的片段。方法如下:
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
onTabSelected(tab, ft);
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
FragmentManager fragmentManager = getFragmentManager();
switch(tab.getPosition()) {
case 0 :
fragmentManager.beginTransaction()
.replace(R.id.buttons_box, ButtonsFragment.newInstance(0))
.commit();
fragmentManager.beginTransaction()
.replace(R.id.container, ControlsFragment.newInstance(0))
.commit();
break;
case 1 :
...
case 2 :
...
}
}
当我想为片段添加菜单项时出现问题。在ControlsFragment中,我添加了以下方法:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
{
inflater.inflate(R.menu.controls, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch(item.getItemId())
{
case R.id.control_1 :
Toast.makeText(getActivity(), "Clicked Control 1", Toast.LENGTH_SHORT).show();
return true;
default :
return super.onOptionsItemSelected(item);
}
}
并在onCreate(Bundle)中添加了这一行:
setHasOptionsMenu(true);
只有现在,当应用程序运行时,默认选择第一个选项卡,并且一遍又一遍地调用我的Activity中的方法onTabSelected。为什么会出现这种情况?选项卡和片段菜单项是否不兼容?
编辑
我尝试从onTabReselected 中删除对onTabSelected 的调用,但这并没有解决问题。
【问题讨论】:
-
它们不应该不兼容。您使用的是什么操作栏(本机 API 级别 11?AppCompat?ActionBarSherlock?)和片段(本机 API 级别 11?Android 支持 backport?)的实现?顺便说一句,您使用两个
FragmentTransactions而不是一个是有原因的吗? -
@CommonsWare 我正在使用原生的一切——API 14+。至于两个
FragmentTransactions- 我没有使用太多Fragments,也不完全熟悉它的工作原理。您是否建议只将第二笔交易中的replace行添加到第一笔交易中? -
"您是否建议将第二个事务中的替换行添加到第一个事务中?" ——这样会更有效率。可以想象它甚至可能有助于解决您的问题,尽管这会让我感到惊讶。话又说回来,问题本身让我感到惊讶。
-
@CommonsWare 我进行了更改 - 但不幸的是它仍然以相同的方式工作。
标签: android android-fragments android-actionbar android-menu