产品有这么个需求, 主页的 tab 点击时先访问接口, 根据回调确定是跳转到哪一个 fragment, 为了避免点击 tab 时 RadioGroup 直接调转而接口访问失败不能跳转的尴尬, 设置了 RadioButton 的onTouchListener
footSub.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
if (App.isLogin()) {
initChangeSubPage(); // 访问接口, 判断
return true; // 拦截事件, 避免RadioGroup直接跳转
} else {
... // 跳转到某一个
}
}
return false;
}
});
// 接口回调
new BaseObserver() {
@Override
public void onNext(Response response) {
super.onNext(response);
footSub.setChecked(true);
... // 跳转
}
@Override
public void onError(@NotNull Throwable throwable) {
ToastUtil.showToast(MainActivity.this, "获取信息失败");
super.onError(throwable);
}
}
这样的写法如果接口失败了, RadioButton上可能就会残留一个水波纹样式. 百度了半天, 没啥屁用, 于是自己查看 RadioButton 的源码, 找到了几个可能相关的方法, 调试发现, footSub.getBackground() 是一个 RippleDrawable, 看样子就是水波纹的样式了. 于是修改了代码:
footSub.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
if (App.isLogin()) {
// 设置原来的水波纹样式
if (rippleDrawable != null) {
footSub.setBackground(rippleDrawable);
}
initChangeSubPage(); // 访问接口, 判断
return true; // 拦截事件, 避免RadioGroup直接跳转
} else {
... // 跳转到某一个
}
}
return false;
}
});
// 接口回调
new BaseObserver() {
@Override
public void onNext(Response response) {
super.onNext(response);
footSub.setChecked(true);
... // 跳转
}
@Override
public void onError(@NotNull Throwable throwable) {
if (rippleDrawable == null && footSub.getBackground() != null) {
rippleDrawable = footSub.getBackground();
}
footSub.setBackground(null); // 隐藏水波纹
ToastUtil.showToast(MainActivity.this, "获取信息失败");
super.onError(throwable);
}
}
问题解决. 源码/官方文档比百度好用10000倍.