【问题标题】:Are tabs and Fragment menus incompatible in Android?选项卡和片段菜单在 Android 中不兼容吗?
【发布时间】: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


【解决方案1】:

这导致了各种各样的问题,所以我找到了一个简单的解决方法。这个简单的 hack 解决了这个奇怪的问题。

  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
    }
    

【讨论】:

    猜你喜欢
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 2013-11-15
    相关资源
    最近更新 更多