Android兼容开发包Support Package)的示例中,演示了ViewPager和ActionBar导航条一起使用的一个示例,该示例的代码目录位于:

android-sdk-windows\extras\android\support\v13\samples\Support13Demos

目录中的

/Support13Demos/src/com/example/android/supportv13/app/ActionBarTabsPager.java

Java类中。

运行界面如下:

ActionBar导航示例

如果修改其中的代码,多添加一个ViewPager和Tab导航,当屏幕横屏的时候则Tab导航会自动变为List导航。如下图:

ActionBar Tab导航变为List导航

在这种List导航模式下 有个Bug,就是当左右滑动下面的ViewPager的时候,上面的List当前内容不变化,如下图:

List导航的bug

原因是如下的函数在List模型下没有更改里面使用的Spinner的当前列表项:

mActionBar.setSelectedNavigationItem(position);
该Bug的修改方式见如下链接:https://android-review.googlesource.com/#/c/32492/如果您无法修改Android系统的代码,则可以通过如下的方式来解决该Bug:
@Overridepublic void onPageScrollStateChanged(int state) {}@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}@Overridepublic void onPageSelected(int position) {    actionBar.setSelectedNavigationItem(position);    selectInSpinnerIfPresent(position, true);}/** * Hack that takes advantage of interface parity between ActionBarSherlock and the native interface to reach inside * the classes to manually select the appropriate tab spinner position if the overflow tab spinner is showing. *  * Related issues: https://github.com/JakeWharton/ActionBarSherlock/issues/240 and * https://android-review.googlesource.com/#/c/32492/ *  * @author toulouse@crunchyroll.com */private void selectInSpinnerIfPresent(int position, boolean animate) {    try {        View actionBarView = findViewById(R.id.abs__action_bar);        if (actionBarView == null) {            int id = getResources().getIdentifier("action_bar", "id", "android");            actionBarView = findViewById(id);        }        Class<?> actionBarViewClass = actionBarView.getClass();        Field mTabScrollViewField = actionBarViewClass.getDeclaredField("mTabScrollView");        mTabScrollViewField.setAccessible(true);        Object mTabScrollView = mTabScrollViewField.get(actionBarView);        if (mTabScrollView == null) {            return;        }        Field mTabSpinnerField = mTabScrollView.getClass().getDeclaredField("mTabSpinner");        mTabSpinnerField.setAccessible(true);        Object mTabSpinner = mTabSpinnerField.get(mTabScrollView);        if (mTabSpinner == null) {            return;        }        Method setSelectionMethod = mTabSpinner.getClass().getSuperclass().getDeclaredMethod("setSelection", Integer.TYPE, Boolean.TYPE);        setSelectionMethod.invoke(mTabSpinner, position, animate);    } catch (IllegalArgumentException e) {        e.printStackTrace();    } catch (IllegalAccessException e) {        e.printStackTrace();    } catch (NoSuchFieldException e) {        e.printStackTrace();    } catch (NoSuchMethodException e) {        e.printStackTrace();    } catch (InvocationTargetException e) {        e.printStackTrace();    }}

注意:

  • You need to implementOnPageChangeListener
  • And set it in your viewPager:viewPager.setOnPageChangeListener(this);(the fact that it's "this" is arbitrary)
  • Then use the code above (I'd appreciate the credit staying in there if you do use it)


原文转载自 云在千峰: http://yunfeng.sinaapp.com/?p=414#ixzz1yseBE0al

更多相关文章

  1. Android的源代码结构
  2. Android(安卓)自定义View及其在布局文件中的使用示例(三):结合An
  3. Android(安卓)SDK 安装过程及安装失败的处理方法[转]
  4. android Setting中隐藏项实现原理与代码
  5. 讲给Android程序员看的前端教程(20)——float浮动
  6. Android(安卓)Jni代码示例讲解
  7. Android团队提供的示例项目
  8. Android(安卓)UI基础——SeekBar&RatingBar控件
  9. Android(安卓)Studio 单刷《第一行代码》系列 07 —— Broadcast

随机推荐

  1. NiceVieoPlayer 完美视频播放器 解决黑屏
  2. Android(安卓)4.0 系统源代码将于本月17
  3. 百度91无线公司招聘无线开发程序员(Androi
  4. Android之使用adb wireless进行调试
  5. Android开发——菜单ActionBar
  6. 为什么移动端跨平台开发不靠谱?
  7. Android语音识别的具体实现实例特点分析
  8. Android中TextView首行缩进处理办法
  9. Android(安卓)使用LeakCanary 检测内存泄
  10. Android(安卓)Studio 进阶详细配置