Android ActionBar 作为导航条的一个Bug

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:
@Override
public void onPageScrollStateChanged(int state) {
}

@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}

@Override
public 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 implement OnPageChangeListener
  • 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

时间: 2024-07-29 19:16:10

Android ActionBar 作为导航条的一个Bug的相关文章

创建一个纯CSS的水平导航条

css|创建 按照传统的方法,导航条由放在一行表格单元里的图形图像构成.由于人们不再推荐用表格来定位任何非表格的页面内容,所以很多制作Web的人正在寻找(新的)方法,用结构化的XHTML标记和CSS格式来创建导航条. 一个简单的CSS导航条 创建CSS样式文本导航条的最简单解决方法也许就是把所有的链接都放在一行文本里,就像例A里的一样. 这种方法看起来很合理也很直观.但问题是,把所有的链接都放在一行文本里就很难控制链接之间以及前后的空白.所以,为了避免所有的链接都挤在一起,你最后通常都不得不插入

第十三节 创建导航条

创建 在很多时候,一个网站的不同页面都使用了同一导航条.导航条一般由几个图像构成,点击不同的图像,将链接到网站不同的页面.通过统一导航条的方法,我们可以实现网站风格的统一,同时也方便了访问者在不同页面间的跳转.用Dreamweaver可做出比较复杂的导航条.导航条由一个或几个部位组成,每个部位均由图像构成,链接到不同的网页页面.每部分,最多可设四个状态下的图像,开始是一个初始图像,当鼠标移动到这个部位上时显示另一个图像,还可设置当鼠标点击后的初始图像,以及鼠标点击后当鼠标再次移动到这个部位上的图

Bootstrap CSS组件之导航条(navbar)_javascript技巧

本文主要大家分享了响应式导航条的具体代码,供大家参考,具体内容如下 1.基础导航条navbar navbar-default navbar-header navbar-brand nav navbar-nav 2.导航条中的表单navbar navbar-default navbar-header navbar-brand navbar-form 3.导航条中的按钮,文本,链接navbar-btn.bavbar-text.navbar-link 4.导航条中的项目进行左右浮动navbar-lef

Android ActionBar完全解析使用官方推荐的最佳导航栏(下)

本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文. http://developer.android.com/guide/topics/ui/actionbar.html 限于篇幅的原因,在上篇文章中我们只学习了ActionBar基础部分的知识,那么本篇文章我们将接着上一章的内容继续学习,探究一下ActionBar更加高级的知识.如果你还没有看过前面一篇文章的话,建议先去阅读Android ActionBar完全解析,使用官方推荐的最佳导航栏(

快速在导航条上移动出现bug

问题描述 快速在导航条上移动出现bug 小弟照极客视频写的一个小demo 当快速在导航条上移动的时候下拉框会出现bug,背景颜色没有了且没有动画效果. 慢慢的移动是可以看见效果的. 正常情况下 不正常情况下 html,css,jquery 解决方案 刚刚自己解决了,原来是我引用的jquery库的版本太低了.换了一个新的,妥妥的.

Android仿微信5实现滑动导航条_Android

本文实例为大家分享了Android 仿微信5滑动导航效果,供大家参考,具体内容如下 ViewPageAdapter.java package com.rong; import java.util.ArrayList; import java.util.List; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.view.View; publi

Android自定义控件实现可左右滑动的导航条_Android

先上效果图: 这个控件其实算是比较轻量级的,相信不少小伙伴都能做出来.因为项目中遇到了一些特殊的定制要求,所以就自己写了一个,这里放出来.  首先来分析下这个控件的功能:  •能够响应左右滑动,并且能响应快速滑动 •选择项和未选择项有不同的样式表现,比如前景色,背景色,字体大小变粗之内的•在切换选项的时候,如果当前选项未完全呈现在界面前,则自动滚动直至当前选项完全暴露显示前两条还有,简简单单就实现了,主要是第三点,这才是我自定义这个控件的原因!那么如果要实现这个控件,需要用到哪些知识呢?  •用

FLASH制作一个可以伸缩的导航条

导航|伸缩 制作过程使用FLASH MX 中文版,效果如下: 点击这里下载源文件 由于时间比较紧:我作的比较粗糙:请大家谅解:本教程只是希望能给大家一个思路:细节方面自已有时间时再作吧:以 下是制作过程: 一.新建一个大小为:200*200Px:帧频:45:背景色:#FFFFFF:的影片: 二.首先我们来制作四个导航条:由于时间关系:我只作一个:然后复制:因为作法都一样:     步骤A:新建一影片剪辑:起名字为"zishu1":在这个剪辑中共建四个图层:从下到下名字分别为:AS.BT

基于Bootstrap实现下拉菜单项和表单导航条(两个菜单项,一个下拉菜单和登录表单导航条)_javascript技巧

效果图如下所示: 实现代码如下: <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="