3

我正在使用ActionBarSherlock并将此模式应用于我在 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 上的列表适用于整个列表,而不是像 tablistener 那样以每个项目为基础。OnNavigationListener

还是我必须做这样的事情:

@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如果我将手机置于横向模式,它会将选项卡转换为列表并保留片段和列表项之间的关联(之前是选项卡项)我怎么能根据需求而不是方向改变来实现这个结果?

4

1 回答 1

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”

我希望这有帮助。

于 2012-09-06T17:45:54.980 回答