7

我有一个使用 ViewPager + actionbar Sherlock 选项卡的屏幕。我setOnPageChangeListener在寻呼机上有一套,它执行以下操作:

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

如果我只有几个选项卡并且显示所有选项卡,这在纵向模式下甚至在横向模式下都可以正常工作。但是,如果我在横向中添加更多选项卡,它们会折叠成一个下拉小部件。当我通过 ViewPager 进行分页时,该setSelectedNavigationItem方法被执行,但现在它对下拉选择没有影响:它停留在最后选择的值。这真的很糟糕,因为用户缺少视觉线索:选项卡可能会显示“一个”,但用户已经在第 6 页上。

有没有办法以编程方式根据位置更改要显示的选项卡?

PS 我知道为什么会这样:这是来自 com.android.internal.app.ActionBarImpl 的代码:

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");
    }
}

当我逐步完成时,我可以看到导航模式仍然是 NAVIGATION_MODE_TABS 虽然选项卡显示为列表。现在 - 我的下意识反应是将代码放入 onConfigurationChanged 以适当地设置导航模式,但这不应该自动发生吗?

PPS 并且已经为它提交了包含补丁的Android 错误

4

2 回答 2

11

基于我在问题中引用的 Android 错误(请参阅 PPS),这里的解决方法确实有效。只需将其添加到您的寻呼机

mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener()
     {
        @Override
        public void onPageSelected(int position)
        {
           actionBar.getTabAt(position).select();
           ViewParent root = findViewById(android.R.id.content).getParent();
           findAndUpdateSpinner(root, position);
        }

        /**
         * Searches the view hierarchy excluding the content view 
         * for a possible Spinner in the ActionBar. 
         * 
         * @param root The parent of the content view
         * @param position The position that should be selected
         * @return if the spinner was found and adjusted
         */
        private boolean findAndUpdateSpinner(Object root, int position)
        {
           if (root instanceof android.widget.Spinner)
           {
              // Found the Spinner
              Spinner spinner = (Spinner) root;
              spinner.setSelection(position);
              return true;
           }
           else if (root instanceof ViewGroup)
           {
              ViewGroup group = (ViewGroup) root;
              if (group.getId() != android.R.id.content)
              {
                 // Found a container that isn't the container holding our screen layout
                 for (int i = 0; i < group.getChildCount(); i++)
                 {
                    if (findAndUpdateSpinner(group.getChildAt(i), position))
                    {
                       // Found and done searching the View tree
                       return true;
                    }
                 }
              }
           }
           // Nothing found
           return false;
        }
     });
于 2012-12-05T20:57:26.483 回答
0

您需要在文件( ActionBarImpl.java )中的 ActionBarSherlock 库项目中添加一些代码,请参阅此链接

于 2012-12-05T05:46:58.470 回答