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