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
。为什么会这样?标签和片段菜单项是否不兼容?
修改
我尝试从onTabSelected
删除对onTabReselected
的来电,但这并没有解决问题。
答案 0 :(得分:0)
这引起了各种各样的问题,所以我找到了一个简单的解决方法。这个简单的黑客修复了这个奇怪的问题。
创建变量:
private Tab currentTab;
在onTabSelected
:
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
if (currentTab == null)
currentTab = tab;
else if (currentTab == tab)
return;
else
currentTab = tab;
//your code here
}