选项卡和片段菜单是否与Android不兼容?

时间:2014-01-22 16:23:14

标签: android android-fragments android-actionbar android-menu

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的来电,但这并没有解决问题。

1 个答案:

答案 0 :(得分:0)

这引起了各种各样的问题,所以我找到了一个简单的解决方法。这个简单的黑客修复了这个奇怪的问题。

  1. 创建变量:

    private Tab currentTab;
    
  2. 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
    }