利用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); } } }折腾了半天终于搞定了。菜鸟伤不起啊!