利用RadioGroup做底部导航栏,实现与ViewPager的联动,实现思路如下:

首先,为ViewPager添加一个pageChangeListener,在onPageSelected中实现RadioButton的联动。

 mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener()        {            @Override            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)            {            }            @Override            public void onPageSelected(int position)            {                mBottomBar.check(mRbId[position]);            }            @Override            public void onPageScrollStateChanged(int state)            {            }        });    }
试一下效果,滑动viewPager后,会选中相应的RadioButton。

然后,为RadioGroup添加一个OnCheckChangeListener,实现点击相应的RaidoButton选择相应的Pager。

mBottomBar.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()        {            @Override            public void onCheckedChanged(RadioGroup group, int checkedId)            {                for (int i = 0; i < mRbId.length; i++)                {                    //获取RaidoButton对应页面的位置                    if (mRbId[i] == checkedId)                    {                        mViewPager.setCurrentItem(i, false);                        break;                    }                }            }        });
点击相应的RadioButton,会选中相应的页面。

不过,滑动起来,Page动作很快,和没加OnCheckChangeListener之前不是一个效果了。什么情况!

打了个Log试了一下,滑动过一个页面,onCheckedChanged调用了3次!这是神马情况!!!!!!!

看了一下源码:

public void check(@IdRes int id) {        // don't even bother        if (id != -1 && (id == mCheckedId)) {            return;        }        if (mCheckedId != -1) {            setCheckedStateForView(mCheckedId, false);        }        if (id != -1) {            setCheckedStateForView(id, true);        }        setCheckedId(id);    }    private void setCheckedId(@IdRes int id) {        mCheckedId = id;        if (mOnCheckedChangeListener != null) {            mOnCheckedChangeListener.onCheckedChanged(this, mCheckedId);        }    }
先取消上一个的选中状态,在选择现在这个,最后调用onCheckedChanged,这只有一次啊?setCheckedStateForView里面调用了RadioButton的setChecked方法。在setChecked里面有这么一句:

notifyViewAccessibilityStateChangedIfNeeded(                    AccessibilityEvent.CONTENT_CHANGE_TYPE_UNDEFINED);
这是什么鬼!谷歌对AccessibilityEvent 的解释如下:This class represents accessibility events that are sent by the system when something notable happens in the user interface. For example, when a Button is clicked, a View is focused, etc.

问题就出在这上面了!notifyViewAccessibilityStateChangedIfNeeded这个方法在View下面,它会把事件发送给上级视图。怪不得会调用3次!怎么解决呢?

http://stackoverflow.com/questions/32295984/using-radiogroup-to-switch-viewpager-views

在这找到了答案,改一下ViewPager 的监听。

@Override                                               public void onPageSelected(int position)                                               {                                                   super.onPageSelected(position);                                                   mBottomBar.setOnCheckedChangeListener(null);                                                   mBottomBar.check(mRbId[position]);                                                   mBottomBar.setOnCheckedChangeListener(MainActivity.this);                                               }
把RadioGroup的Listener拿到activity中。

@Override    public void onCheckedChanged(RadioGroup group, int checkedId)    {        for (int i = 0; i < mRbId.length; i++)        {            if (mRbId[i] == checkedId)            {                mViewPager.setCurrentItem(i);            }        }    }
折腾了半天终于搞定了。菜鸟伤不起啊!






更多相关文章

  1. 安全新手入坑——HTML标签
  2. Nginx系列教程(四)| 一文带你读懂Nginx的动静分离
  3. 自定义平滑滑动页面的组件:DragableSpace
  4. 46.Android(安卓)自定义Dialog
  5. Android(安卓)Kotlin intent.getStringExtra("xxx") 获取为 null
  6. Android(安卓)layer-list的属性和使用详解(阴影、边框效果)
  7. android 开源组件合集-UI篇(2013-11-07更新)
  8. 初学Android,图形图像之使用Path类
  9. Android(安卓)开源项目及网址

随机推荐

  1. Android事件分发机制分析
  2. android 根据经纬度定位所在城市
  3. Android:短信发送器
  4. Android(安卓)Studio的NDK的两种编译方式
  5. android - 购物车页面【仿】京东App
  6. Android手机通过USB线连接PC共享上网
  7. android 隐藏键盘 显示键盘
  8. Android之下载管理者
  9. android4.4系统永不锁屏
  10. android 层叠图片形成一张图片