【问题标题】:Switch between tab navigation and list navigation在选项卡导航和列表导航之间切换
【发布时间】:2012-04-24 19:14:40
【问题描述】:

我正在使用ActionBarSherlock 并将this pattern 应用于我在android 开发者网站上找到的标签导航。它工作得很好,但我也希望能够在 NAVIGATION_MODE_TABSNAVIGATION_MODE_LIST 之间切换,保留选项卡和片段之间的关联。

我上面提到的模式非常适合保留通用代码。因此,我将侦听器添加到我的选项卡并将它们与特定片段相关联,如下所示:

bar.addTab(bar.newTab()
.setText("MyFragment")
.setTabListener(new TabListener<SomeFragment>(this, "myfargment", SomeFragment.class)));

并在泛型的帮助下单击关联的选项卡时实例化片段:

public void onTabSelected(Tab tab, FragmentTransaction ft) {
    if (mFragment == null) {
        mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs);
        ft.add(android.R.id.content, mFragment, mTag);
    } else {
        ft.attach(mFragment);
    }
}

我的问题是列表导航模式下在我的片段之间导航时如何实现类似的方式。我找不到类似的方法,因为 ActionBar 上列表的 OnNavigationListener 适用于整个列表,而不是像 tablistener 那样每个项目的基础

或者我必须这样做:

@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
    switch (itemPosition) {
    case 0:
    //Replace the current fragment with FragmentA
        break;
    case 1:
    //Replace the current fragment with FragmentB
        break;
    case 2:
    //Replace the current fragment with FragmentC
        break;
    default:
        break;
    }
    return true;
}

编辑:

我注意到一个有趣的行为: 虽然导航模式设置为NAVIGATION_MODE_TABS,但如果我将手机置于横向模式,它会将标签转换为列表并保留关联在片段和列表项之间(之前是选项卡项)我怎样才能按需而不是改变方向来实现这个结果?

【问题讨论】:

    标签: android tabs android-fragments actionbarsherlock android-actionbar


    【解决方案1】:

    如果您在选项卡模式下手动设置为列表导航,我认为这是不可能的。当我的一个应用程序低于“大”存储桶时,我为它设置了列表导航。这就是我使用导航监听器的方式:

    OnNavigationListener mNavigationListener = new OnNavigationListener()
    {
    int mLastPosition = -1;
    
    @Override
    public boolean onNavigationItemSelected(int itemPosition, long itemId)
    {
        String selectedTag = mFragmentNames.get(itemPosition);
    
        FragmentManager fm = getSupportFragmentManager();
        Fragment fragment = fm.findFragmentByTag(selectedTag);
        FragmentTransaction ft = fm.beginTransaction();
    
        /** Used to avoid the same fragment being reattached. */
        if(mLastPosition != itemPosition)
        {
        /** Means there was a previous fragment attached. */
        if(mLastPosition != -1)
        {
            Fragment lastFragment = fm.findFragmentByTag(mFragmentNames.get(mLastPosition));
            if(lastFragment != null)
            ft.remove(lastFragment);
        }
    
        if(fragment == null)
        {
            /** The fragment is being added for the first time. */
            fragment = Fragment.instantiate(HomeActivity.this, selectedTag);
            ft.add(R.id.rootLayout, fragment, selectedTag);
            ft.commit();
        } else
        {
            ft.attach(fragment);
            ft.commit();
        }
        }
        /**
         * The newly attached fragment will be the last position if changed.
         */
        mLastPosition = itemPosition;
    
        return true;
    }
    };
    

    变量 mFragmentNames 是一个 HashMap,它将整数位置映射到片段名称 ex。 "com.android.myproject.MyFragment"

    我希望这会有所帮助。

    【讨论】: