1.设置默认选中
2.某些情况下的手动设置选中
最近项目中用到了bottombar作为底部导航栏来替代之前的radiogroup来控制页面的跳转,在进入程序时时,设置默认的首页面可以用:
bottomBar.selectTabWithId(id);
但是我现在有个需求,如图,点击第一个tab和第三个tab都是切换fragment,点击第二个tab则是跳转到一个新的activity,奇怪的事情这就发生了。
当我在第一个页面点击第二个tab的时候,跳转到一个新的activity,我在新的activity再次返回到首页,这时首页加载的还是第一个fragment,但是下面的tab选中的还是第二个!这是不是极其不合理!
在查阅api并且百度之后,发现一个回调方法:
@Override
public boolean shouldInterceptTabSelection(int oldTabId, int newTabId)
其中有两个参数,字面意思,第一个参数是在点击当前tab时的上一个tab的id,只要我们在点击第二个tab的时候,手动调用
bottomBar.selectTabWithId(oldTabId)
方法让它选中不就行了。
@Override
public boolean shouldInterceptTabSelection(int oldTabId, int newTabId) {
switch (newTabId) {
case R.id.tab_1:
return false;
case R.id.tab_2:
Intent intent = new Intent(mContext, TestActivity.class);
startActivity(intent);
bottomBar.selectTabWithId(oldTabId);
return false;
case R.id.tab_3:
return false;
default:
return false;
}
等等,事情好像并没有那么简单。
我这么设置之后,选项卡应该是选择到了tab1,但是,然而并没有!
为什么呢?
经过测试(源码还没时间看,以下仅为猜测),tab选中的事件在响应跳转(点击)之后,即我们虽然设置tab1为选中,但是紧接着系统又将事件分发下去,将tab2设置为选中,所以就出现了上述的情况。
问题找到了,下面是我的解决方案:
首先在shouldInterceptTabSelection回调中将oldTabId记录下来
@Override
public boolean shouldInterceptTabSelection(int oldTabId, int newTabId) {
switch (newTabId) {
case R.id.tab_1:
return false;
case R.id.tab_2:
Intent intent = new Intent(mContext, TestActivity.class);
startActivity(intent);
this.oldTabId = oldTabId;
return false;
case R.id.tab_3:
return false;
default:
return false;
}
}
然后在activity的生命周期onStart中再将oldTabId设置回来
@Override
protected void onRestart() {
super.onRestart();
if (oldTabId != 0) {
bottomBar.selectTabWithId(oldTabId);
}
}
至此,问题解决。
如果哪里有误还烦请指正呀
点击这里获取找到我,获取更多哦
分享小知识,记录你的小故事呀