先说viewpager2吧,这个是一个新的控件,很好用,特别是用kotlin之后。
但在做垂直滑动的时候里面嵌套一个edittext出现了大问题,但我相信如果你对自定义很熟悉的话最后还是不用再viewapger里面嵌套editext,因为edittext每次都弹出软键盘和每输入一个字的时候view pager2 会重绘,会重新执行一些方法,然而一个方法会每次都会清除所有的焦点并且会赋值第一item的焦点,大家都知道viewpager2内部核心是recyclerview实现 的。
// Add currentItemUpdater before mExternalPageChangeCallbacks, because we need to update
// internal state first
mPageChangeEventDispatcher.addOnPageChangeCallback(currentItemUpdater);
mPageChangeEventDispatcher.addOnPageChangeCallback(focusClearer);
看到上面的一个回调中focusClearer,继续
// Prevents focus from remaining on a no-longer visible page
final OnPageChangeCallback focusClearer = new OnPageChangeCallback() {
@Override
public void onPageSelected(int position) {
clearFocus();
if (hasFocus()) { // if clear focus did not succeed
mRecyclerView.requestFocus(View.FOCUS_FORWARD);
}
}
};
clearFocus ()最终会走到这个方法,这里是Android sdk30
/**
* Clears focus from the view, optionally propagating the change up through
* the parent hierarchy and requesting that the root view place new focus.
*
* @param propagate whether to propagate the change up through the parent
* hierarchy
* @param refocus when propagate is true, specifies whether to request the
* root view place new focus
*/
void clearFocusInternal(View focused, boolean propagate, boolean refocus) {
if ((mPrivateFlags & PFLAG_FOCUSED) != 0) {
mPrivateFlags &= ~PFLAG_FOCUSED;
clearParentsWantFocus();
if (propagate && mParent != null) {
mParent.clearChildFocus(this);
}
onFocusChanged(false, 0, null);
refreshDrawableState();
if (propagate && (!refocus || !rootViewRequestFocus())) {
notifyGlobalFocusCleared(this);
}
}
}
本人对源码都是很不了解大概是会清除父类下面的子类并刷新。
所以说如果改变了当前页面,如果有焦点会一并清除,而edittext需要随时获取焦点,所以造成了获取焦点出现问题
解决方法:
/**
* Use with {@link #focusSearch(int)}. Move focus to the next selectable
* item.
* /**
*与{@link#focusSearch(int)}一起使用。将焦点移到下一个可选择的位置
*项目。
*/
*/
public static final int FOCUS_FORWARD = 0x00000002;
因为之后会设置这个值,上面是百度翻译过了,说的是会把焦点自动移动到下一个可选择的位置,只需要再再添加一个edittext设置宽度为0就好。
scrollerview嵌套百度地图MapView导致滑动有黑边或者阴影问题
这个是刚刚开始些的时候发现的,老版本是不建议再scrollview里面嵌套地图的,而新的版本解决办法是用另一个map com.baidu.mapapi.map.TextureMapView就可以解决问题,也测试过,完美解决