Android平台4.2.2與Cordova2.2.0結合使用后出現軟鍵盤彈出后,覆蓋輸入域問題,在Android的4.0.3中測試沒有這樣的問題,設置AndroidManifest.xml中的activity的android:windowSoftInputMode="adjustPan"不起作用,通過google發現者可能是android的一個bug或者是cordova的bug。。。
借鑒了網上的一種寫法
代碼如下:
package com.siro.androidwebviewos.utils;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.Rect;
import android.util.Log;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.FrameLayout;
import com.siro.androidwebviewos.action.OpenNewActivity;
@SuppressLint("NewApi")
public class AndroidBug5497Workaround {
public static void assistActivity (OpenNewActivity activity) {
new AndroidBug5497Workaround(activity);
}
private View rootView ;
private int mLastHeightDifferece ;
private AndroidBug5497Workaround(Activity activity) {
rootView = activity.findViewById(android.R.id.content);
rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout() {
checkHeightDifference();
}
});
}
private void checkHeightDifference(){
// get screen frame rectangle
Rect r = new Rect();
rootView.getWindowVisibleDisplayFrame(r);
int screenHeight = rootView.getRootView().getHeight();
int heightDifference = screenHeight - (r.bottom - r.top);
if (heightDifference > screenHeight/3 && heightDifference != mLastHeightDifferece) {
rootView.getLayoutParams().height = screenHeight - heightDifference;
rootView.requestLayout();
mLastHeightDifferece = heightDifference;
} else if (heightDifference != mLastHeightDifferece) {
rootView.getLayoutParams().height = screenHeight;
rootView.requestLayout();
mLastHeightDifferece = heightDifference;
}
}
}
activity中調用:
在loadUrl后調用
AndroidBug5497Workaround.assistActivity(this);
效果不理想,雖然有屏幕上推的效果,但是,輸入域還是被覆蓋。
經過同事提醒改變了一下寫法,效果還可以。
public class OpenNewActivity extends DroidGap implements OnTouchListener 實現OnTouchListener
重寫onTouch方法,主要獲取getRawY
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
eventX = event.getRawX() ;
eventY = event.getRawY() ;
}
return false;
}
oncreate方法的loadUrl之后增加對rootView的監聽:
rootView = this.findViewById(android.R.id.content);
rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout() {
checkHeightDifference();
}
});
通過當前屏幕高度,彈出后的軟鍵盤高度及所點擊輸入域的RawY。計算rootView的位移量,並且requestLayout();
@SuppressLint("NewApi")
private void checkHeightDifference(){
Rect r = new Rect();
rootView.getWindowVisibleDisplayFrame(r);
int screenHeight = rootView.getRootView().getHeight();
int heightDifference = screenHeight - (r.bottom - r.top);
if (heightDifference > screenHeight/3 && heightDifference != mLastHeightDifferece) {
rootView.setTranslationY(- (heightDifference - ( screenHeight - eventY)+20));
rootView.requestLayout();
mLastHeightDifferece = heightDifference;
} else if (heightDifference != mLastHeightDifferece) {
rootView.setTranslationY(heightDifference);
rootView.requestLayout();
mLastHeightDifferece = heightDifference;
}
}
onTouch