欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

android 沉浸式引起的edittext软键盘遮挡问题

程序员文章站 2022-03-02 14:37:19
...

一次探索沉浸式的主题edittext软键盘弹起遮挡的问题,分两种情况

1.非透明状态栏下使用adjustResize和adjustPan

主要实现方法: 
在AndroidManifest.xml对应的Activity里添加 
android:windowSoftInputMode的属性 
 

activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android1.5后的一个新特性。 

这个属性能影响两件事情: 

【A】当有焦点产生时,软键盘是隐藏还是显示 

【B】是否减少活动主窗口大小以便腾出空间放软键盘 

各值的含义: 

【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置 

【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示 

【C】stateHidden:用户选择activity时,软键盘总是被隐藏 

【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的 

【E】stateVisible:软键盘通常是可见的 

【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态 

【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示 

【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间 

【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的

主要使用H和I属性

2.透明状态栏下使用fitsSystemWindows=true属性

fitsSystemWindows在布局中添加,含义是指在添加的布局上方留出来状态栏的的高度,这个高度

重要说明:

  1. 只有将状态栏设为透明,或者界面设为全屏显示(设置View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN flag)时,fitsSystemWindows才会起作用。不然状态栏的空间轮不到用户处理,这时会由ContentView的父控件处理,如果用HierarchyView 工具查看,将会看到,ContentView的父控件的paddingTop将会被设置。
  2. 如果多个view同时设置了fitsSystemWindows,只有第一个会起作用

上方的是一些小知识,下面进入正题

  我设置自定义的toolber后布局中ScrollView添加多个edittext点击底部的edittext,当获得焦点是软键盘掩盖了edittext的输入框,下面的输入框都不能选择的影响用户体验.

我的处理是

1.在根布局添加fitsSystemWindows=true属性

2.在activity中添加requestWindowFeature(Window.FEATURE_NO_TITLE);在setContentView之前添加

3.在setContentView之后添加

try {
    assistActivity();
} catch (Exception e) {

}

这样就做到edittext获得焦点界面能够滚动软键盘弹出的上方,不影响输入和滑动输入下方的输入框

 

关于assistActivity的代码如下

public void assistActivity() {
    getContentView(activity).getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        public void onGlobalLayout() {
            frameLayoutParams = (FrameLayout.LayoutParams) getContentView(activity).getLayoutParams();
            int usableHeightNow = computeUsableHeight();
            if (usableHeightNow != usableHeightPrevious) {
                int usableHeightSansKeyboard = getContentView(activity).getHeight();
                int heightDifference = usableHeightSansKeyboard - usableHeightNow;
                if (Math.abs(heightDifference) > (usableHeightSansKeyboard / 4)) {
                    // keyboard probably just became visible
                    frameLayoutParams.height = usableHeightSansKeyboard - heightDifference;
                } else {
                    // keyboard probably just became hidden
                    frameLayoutParams.height = usableHeightSansKeyboard;
                }
                getContentView(activity).requestLayout();
                usableHeightPrevious = usableHeightNow;
            }
        }
    });
}