在选择Web的输入框弹出键盘,这时WebView的高度改变重新渲染,如果html调整层级的位置使内容除输入框外不变,先将层级上移再移回原来位置时就会出现闪屏。经测试,有些手机会出现闪屏,有些不会。想到了禁止WebView滚动应该可以解决问题。
但是如何禁止WebView不可滚动呢?WebView有几个与滚动有关的方法,但是都无效。如:
WebView.setScrollContainer(false);
WebView.setVerticalScrollBarEnabled(false);
WebView.setHorizontalScrollBarEnabled(false);
后来看到WebView有个scrollTo(int x, int y)方法,于是重写该方法使其x,y都为0,结果头痛了几天的问题解决了,在此记录下来
public class WebViewMod extends WebView {
public EditText mFocusDistraction;
public Context mContext;
public WebViewMod(Context context) {
super(context);
init(context);
}
public WebViewMod(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public WebViewMod(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
@SuppressLint("NewApi")
public WebViewMod(Context context, AttributeSet attrs, int defStyle, boolean privateBrowsing) {
super(context, attrs, defStyle, privateBrowsing);
init(context);
}
public void init(Context context) {
// This lets the layout editor display the view.
if (isInEditMode()) return;
mContext = context;
mFocusDistraction = new EditText(context);
mFocusDistraction.setBackgroundResource(android.R.color.transparent);
this.addView(mFocusDistraction);
mFocusDistraction.getLayoutParams().width = 1;
mFocusDistraction.getLayoutParams().height = 1;
}
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
invalidate();
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
public boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY,
int scrollRangeX, int scrollRangeY, int maxOverScrollX,
int maxOverScrollY, boolean isTouchEvent) {
return false;
}
/**
* 使WebView不可滚动
* */
@Override
public void scrollTo(int x, int y){
super.scrollTo(0,0);
}
}