Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

输入的时候会被输入法遮挡住,请问如何做才能让输入框自动移动到输入法上面 #225

Open
LongLongLongLongLongLongLongLongLong opened this issue Apr 28, 2020 · 2 comments

Comments

@LongLongLongLongLongLongLongLongLong
        android:windowSoftInputMode="adjustResize"等各种设置试过,没有效果。
        希望有人遇到同样问题能有个解决方法,谢谢
@MAZENAN
Copy link

MAZENAN commented Jun 29, 2020

请问可以了吗?

@LongLongLongLongLongLongLongLongLong

请问可以了吗?

可以了,我在网上参考了其他人的一个工具,完整代码如下
import android.app.Activity;
import android.content.Intent;
import android.graphics.Rect;
import android.os.Build;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.FrameLayout;

import com.h3c.zhdj.app.learning.experience.LearningExperienceActivity;

/**

  • 调整输入法弹出时,整体上移
    */
    public class SoftHideKeyBoardUtil {

    public static void assistActivity(Activity activity) {
    new SoftHideKeyBoardUtil(activity);
    }

    private View mChildOfContent;
    private int usableHeightPrevious;
    private FrameLayout.LayoutParams frameLayoutParams;
    //为适应华为小米等手机键盘上方出现黑条或不适配
    private int contentHeight;//获取setContentView本来view的高度
    private boolean isfirst = true;//只用获取一次
    private int statusBarHeight;//状态栏高度
    private Activity mActivity;

    private SoftHideKeyBoardUtil(Activity activity) {

     mActivity = activity;
     //1、找到Activity的最外层布局控件,它其实是一个DecorView,它所用的控件就是FrameLayout
     FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);
     //2、获取到setContentView放进去的View
     mChildOfContent = content.getChildAt(0);
     //3、给Activity的xml布局设置View树监听,当布局有变化,如键盘弹出或收起时,都会回调此监听
     mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
         //4、软键盘弹起会使GlobalLayout发生变化
         public void onGlobalLayout() {
             if (isfirst) {
                 contentHeight = mChildOfContent.getHeight();//兼容华为等机型
                 isfirst = false;
             }
             contentHeight = mChildOfContent.getHeight();//兼容华为等机型
    
             //5、当前布局发生变化时,对Activity的xml布局进行重绘
             possiblyResizeChildOfContent();
         }
     });
     //6、获取到Activity的xml布局的放置参数
     frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();
    

    }

    // 获取界面可用高度,如果软键盘弹起后,Activity的xml布局可用高度需要减去键盘高度
    private void possiblyResizeChildOfContent() {
    //1、获取当前界面可用高度,键盘弹起后,当前界面可用布局会减少键盘的高度
    int usableHeightNow = computeUsableHeight();
    //2、如果当前可用高度和原始值不一样
    if (usableHeightNow != usableHeightPrevious) {
    //3、获取Activity中xml中布局在当前界面显示的高度
    int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();
    //4、Activity中xml布局的高度-当前可用高度
    int heightDifference = usableHeightSansKeyboard - usableHeightNow;
    //5、高度差大于屏幕1/4时,说明键盘弹出
    if (heightDifference > (usableHeightSansKeyboard / 4)) {
    // 6、键盘弹出了,Activity的xml布局高度应当减去键盘高度
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    frameLayoutParams.height = usableHeightSansKeyboard - heightDifference + statusBarHeight;
    } else {
    frameLayoutParams.height = usableHeightSansKeyboard - heightDifference;
    }

             if(mActivity!=null){
                 Intent i = new Intent();
                 i.setAction(LearningExperienceActivity.KEYBORAD_SHOW_ACTION);
                 mActivity.sendBroadcast(i);
             }
    
             LogUtils.iTagSpaceParams("SoftHideKeyBoardUtil","键盘弹出");
         } else {
             LogUtils.iTagSpaceParams("SoftHideKeyBoardUtil","没有键盘弹出");
             //frameLayoutParams.height = contentHeight;
             frameLayoutParams.height = usableHeightSansKeyboard - heightDifference;
    
         }
         //7、 重绘Activity的xml布局
         mChildOfContent.requestLayout();
         usableHeightPrevious = usableHeightNow;
     }
    

    }

    private int computeUsableHeight() {
    Rect r = new Rect();
    mChildOfContent.getWindowVisibleDisplayFrame(r);
    // 全屏模式下:直接返回r.bottom,r.top其实是状态栏的高度
    return (r.bottom - r.top);
    }

}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants