6

我面临一个关于标签滑动的问题。我的项目是基于 Android 3.2 构建的。我正在使用支持库 4.0 (android-support-v4.jar) 实现标签滑动。实现的一切都运行良好,但是当我将我的应用程序部署到 ICS 设备时,在纵向模式下,我会在操作栏中获得一个用于选项卡选择的微调器。在纵向模式下,尽管内容正在发生变化,但滑动完成时选项卡选择不会改变,并且在横向模式下一切正常。

final ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionBar.setDisplayHomeAsUpEnabled(true);
// Set up the ViewPager with the sections adapter.
ViewPager mViewPager = (ViewPager) findViewById(R.id.pager);

mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {

    @Override
    public void onPageSelected(int position) {
        actionBar.setSelectedNavigationItem(position);
    }

});

我已经尝试actionBar.setSelectedNavigationItem(position);在这条线上放置断点,甚至在纵向模式下它也会被调用,但选择没有改变。

有人可以帮忙吗?

编辑: 发现了一个类似的问题,但不知道它是如何解决的以及如何将它集成到我的代码中。

4

1 回答 1

17

问题: 由于真实状态不足,平台使用折叠导航(即 Spinner)。系统自动确定横向的 NAVIGATION_MODE_TABS 和纵向的 NAVIGATION_MODE_LIST,将方向从横向更改为纵向会更新 UI,但由于某种原因不会将导航模式属性更新为 NAVIGATION_MODE_LIST,因此不会调用 mActionView.setDropdownSelectedPosition(position)。请参阅 ActionBarImpl 的以下代码: setSelectedNavigationItem

    public void setSelectedNavigationItem(int position) {
    switch (mActionView.getNavigationMode()) {
    case NAVIGATION_MODE_TABS:
        selectTab(mTabs.get(position));
        break;
    case NAVIGATION_MODE_LIST:
        mActionView.setDropdownSelectedPosition(position);
        break;
    default:
        throw new IllegalStateException(
                "setSelectedNavigationIndex not valid for current navigation mode");
    }
}

变通方案: 通过反射我们可以得到tab spinner对象并调用setSelection方法。

private Spinner getTabSpinner()
{
    try
    {
        int id = getResources().getIdentifier("action_bar", "id", "android");
        View actionBarView = findViewById(id);

        Class<?> actionBarViewClass = actionBarView.getClass();
        Field mTabScrollViewField = actionBarViewClass.getDeclaredField("mTabScrollView");
        mTabScrollViewField.setAccessible(true);

        Object mTabScrollView = mTabScrollViewField.get(actionBarView);
        if (mTabScrollView == null) {
            return null;
        }

        Field mTabSpinnerField = mTabScrollView.getClass().getDeclaredField("mTabSpinner");
        mTabSpinnerField.setAccessible(true);

        Object mTabSpinner = mTabSpinnerField.get(mTabScrollView);
        if (mTabSpinner != null)
        {
            return (Spinner)mTabSpinner;
        }
    } 
    catch (Exception e) {
        return null;
    }

    return null;
}

然后在 onPageSelected 事件中调用上述方法。

        public void onPageSelected(int position) {
            actionBar.setSelectedNavigationItem(position);
            Spinner spinner = getTabSpinner();
            if (spinner != null) {
                spinner.setSelection(position);
            }
        }

参考了这篇文章https://gist.github.com/2657485

于 2012-10-07T12:20:28.157 回答