• android全屏下的输入框未跟随软键盘弹起问题


    最近开发中遇到,全屏模式下输入框在底部不会跟随软键盘弹起。于是网上搜索了解决的方案。大致找到了两种方案。

    第一种

    定义好此类

    public class SoftKeyBoardListener {

    private View rootView;//activity的根视图
    int rootViewVisibleHeight;//纪录根视图的显示高度
    private OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener;

    public SoftKeyBoardListener(Activity activity) {
    //获取activity的根视图
    rootView = activity.getWindow().getDecorView();

    //监听视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变
    rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
    //获取当前根视图在屏幕上显示的大小
    Rect r = new Rect();
    rootView.getWindowVisibleDisplayFrame(r);

    int visibleHeight = r.height();
    System.out.println(""+visibleHeight);
    if (rootViewVisibleHeight == 0) {
    rootViewVisibleHeight = visibleHeight;
    return;
    }

    //根视图显示高度没有变化,可以看作软键盘显示/隐藏状态没有改变
    if (rootViewVisibleHeight == visibleHeight) {
    return;
    }

    //根视图显示高度变小超过200,可以看作软键盘显示了
    if (rootViewVisibleHeight - visibleHeight > 200) {
    if (onSoftKeyBoardChangeListener != null) {
    onSoftKeyBoardChangeListener.keyBoardShow(rootViewVisibleHeight - visibleHeight);
    }
    rootViewVisibleHeight = visibleHeight;
    return;
    }

    //根视图显示高度变大超过200,可以看作软键盘隐藏了
    if (visibleHeight - rootViewVisibleHeight > 200) {
    if (onSoftKeyBoardChangeListener != null) {
    onSoftKeyBoardChangeListener.keyBoardHide(visibleHeight - rootViewVisibleHeight);
    }
    rootViewVisibleHeight = visibleHeight;
    return;
    }

    }
    });
    }

    private void setOnSoftKeyBoardChangeListener(OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) {
    this.onSoftKeyBoardChangeListener = onSoftKeyBoardChangeListener;
    }

    public interface OnSoftKeyBoardChangeListener {
    void keyBoardShow(int height);

    void keyBoardHide(int height);
    }

    public static void setListener(Activity activity, OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) {
    SoftKeyBoardListener softKeyBoardListener = new SoftKeyBoardListener(activity);
    softKeyBoardListener.setOnSoftKeyBoardChangeListener(onSoftKeyBoardChangeListener);
    }

    }
    在Activity中实现

    private SoftKeyBoardListener.OnSoftKeyBoardChangeListener changeListener = new SoftKeyBoardListener.OnSoftKeyBoardChangeListener() {
    @Override
    public void keyBoardShow(int height) {
    //软键盘弹起,inputEt为底部输入框
    ObjectAnimator animator = ObjectAnimator.ofFloat(inputEt, "translationY", 0, -height);
    animator.setDuration(100);
    animator.start();
    edit.setFocusable(true);
    edit.setFocusableInTouchMode(true);
    edit.requestFocus();//获取焦点 光标出现
    }

    @Override
    public void keyBoardHide(int height) {
      //软键盘隐藏
    ObjectAnimator animator = ObjectAnimator.ofFloat(inputEt, "translationY", -height, 0);
    animator.setDuration(100);
    animator.start();

    }
    };
    第二种此方法在全屏模式webview的输入框被遮盖时可以解决。

    public class KeyBoardListener {

    private Activity activity;
    // private Handler mhanHandler;


    private View mChildOfContent;
    private int usableHeightPrevious;
    private FrameLayout.LayoutParams frameLayoutParams;

    private static KeyBoardListener keyBoardListener;


    public static KeyBoardListener getInstance(Activity activity) {
    // if(keyBoardListener==null){
    keyBoardListener = new KeyBoardListener(activity);
    // }
    return keyBoardListener;
    }


    public KeyBoardListener(Activity activity) {
    super();
    // TODO Auto-generated constructor stub
    this.activity = activity;
    // this.mhanHandler = handler;

    }


    public void init() {

    final FrameLayout content = (FrameLayout) activity
    .findViewById(android.R.id.content);
    mChildOfContent = content.getChildAt(0);

    // content.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    // int rootViewHeight;
    // @Override
    // public void onGlobalLayout() {
    // int viewHeight = content.getHeight();
    // if (rootViewHeight != viewHeight) {
    // rootViewHeight = viewHeight;
    // if (viewHeight == getRealHeight()) {
    // //隐藏虚拟按键
    // if (navigationListener != null) {
    // navigationListener.hide();
    // }
    // } else {
    // //显示虚拟按键
    // if (navigationListener != null) {
    // navigationListener.show();
    // }
    // }
    // }
    // }
    // });

    mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() {
    public void onGlobalLayout() {
    possiblyResizeChildOfContent();
    }
    });
    frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent
    .getLayoutParams();


    }


    private void possiblyResizeChildOfContent() {
    int usableHeightNow = computeUsableHeight();
    if (usableHeightNow != usableHeightPrevious) {

    int usableHeightSansKeyboard = 0;
    if(getNavigationBarHeight(activity) == getRealHeight() - getHeight()){
    usableHeightSansKeyboard = getHeight();
    }else{
    usableHeightSansKeyboard = getRealHeight();
    }

    int heightDifference = usableHeightSansKeyboard - usableHeightNow;
    if (heightDifference > (usableHeightSansKeyboard / 4)) {
    // keyboard probably just became visible
    frameLayoutParams.height = usableHeightSansKeyboard
    - heightDifference;
    } else {
    // keyboard probably just became hidden
    frameLayoutParams.height = usableHeightSansKeyboard;
    }
    mChildOfContent.requestLayout();
    usableHeightPrevious = usableHeightNow;
    }
    }


    private int computeUsableHeight() {
    Rect r = new Rect();
    mChildOfContent.getWindowVisibleDisplayFrame(r);
    return (r.bottom - r.top);
    }


    // private void showLog(String title, String msg) {
    // Log.d("Unity", title + "------------>" + msg);
    // }

    /**
    * 获取屏幕真实高度(包括虚拟键盘)
    */
    public static int getRealHeight() {
    WindowManager windowManager = (WindowManager) MyApp.mApp.getSystemService(Context.WINDOW_SERVICE);
    Display display = windowManager.getDefaultDisplay();
    DisplayMetrics dm = new DisplayMetrics();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
    display.getRealMetrics(dm);
    } else {
    display.getMetrics(dm);
    }
    int realHeight = dm.heightPixels;

    return realHeight;
    }

    /**
    * 获取手机屏幕高度
    */
    public static int getHeight() {
    WindowManager windowManager = (WindowManager) MyApp.mApp.getSystemService(Context.WINDOW_SERVICE);
    LogUtil.e("height->",windowManager.getDefaultDisplay().getHeight() + "aa");
    return windowManager.getDefaultDisplay().getHeight();
    }

    public static int getNavigationBarHeight(Activity activity) {
    Resources resources = activity.getResources();
    int resourceId = resources.getIdentifier("navigation_bar_height",
    "dimen", "android");
    //获取NavigationBar的高度
    int height = resources.getDimensionPixelSize(resourceId);

    return height;
    }


    }
    在Activity中的实现:

    KeyBoardListener.getInstance(this).init()
    --------------------- 

  • 相关阅读:
    给Linux添加google搜索命令
    安卓设置脚本开机自启动
    重读The C programming Lanuage 笔记四:c预处理
    重读The C programming Lanuage 笔记三:简单计算器程序
    重读The C programming Lanuage 笔记二:运算符优先级
    重读The C programming Lanuage 笔记一:类型转换
    【 转】 C/C++结构体和联合体的区别
    python 柯里化 和装饰器
    qq bug 一个
    网站收集
  • 原文地址:https://www.cnblogs.com/ly570/p/10995909.html
Copyright © 2020-2023  润新知