zoukankan      html  css  js  c++  java
  • Android Cordova 对于软键盘弹出后覆盖输入域的解决

      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

  • 相关阅读:
    极光推送API简易rails版本
    rake db:migrate出错
    课后作业-阅读任务-阅读提问-5
    课后作业-阅读任务-阅读提问-4
    课后作业-阅读任务-阅读提问-3
    课后作业-阅读任务-阅读提问-2
    课后作业-阅读任务-阅读提问-1
    2017012.01-构建之法:现代软件工程-阅读笔记4
    2017011.17-构建之法:现代软件工程-阅读笔记3
    20170920-构建之法:现代软件工程-阅读笔记1
  • 原文地址:https://www.cnblogs.com/bigcelestial/p/3582530.html
Copyright © 2011-2022 走看看