【问题标题】:Actionbar Sherlock - tabs won't change in landscape when swipingActionbar Sherlock - 滑动时标签不会改变横向
【发布时间】:2012-11-22 21:17:12
【问题描述】:

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

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

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

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

附:我知道为什么会这样: 这是来自 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 以适当地设置导航模式,但这不应该自动发生吗?

附言并且已经提交了包含补丁的Android bug

【问题讨论】:

    标签: android actionbarsherlock android-viewpager landscape android-tabs


    【解决方案1】:

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

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

    【讨论】:

    • 此解决方案适用于本机 ActionBar,但不适用于兼容性(在 Gingerbread 模拟器上)。如何解决这个问题?
    【解决方案2】:

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

    【讨论】:

    • 您指出的修复不起作用,我刚刚检查过。该代码仅从 onConfigurationChanged 调用,但是当我从一个页面滑动到另一个页面时,我需要更改选定的选项卡
    • 如果您使用 ViewPager 而不是在其侦听器内部,您需要明确设置选定的选项卡...这是我在我的一个项目中所做的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多