透明状态栏导致windowSoftInputMode:adjustResize失效问题

时间:2025-03-21 07:28:54

当我们通过下面代码:

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

设置状态栏透明,当界面存在EditText时,在activity里面设置windowSoftInputMode:adjustResize 无效,软键盘依然会遮挡住EditText的焦点位置。
通过下面方式可以解决,大致解决思路是,通过监听视图树的变化,然后把界面滑动到软键盘的上面。

public class WindowSoftModeAdjustResizeExecutor {
    // For more information, see /p/android/issues/detail?id=5497
    // To use this class, simply invoke assistActivity() on an Activity that already has its content view set.

    // CREDIT TO Joseph Johnson (/users/341631/joseph-johnson) for publishing the original Android solution on 

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

    private View mChildOfContent;
    private int usableHeightPrevious;
    private  frameLayoutParams;

    private WindowSoftModeAdjustResizeExecutor(Activity activity) {
        FrameLayout content = (FrameLayout) ();
        mChildOfContent = (0);
        ().addOnGlobalLayoutListener(new () {
            public void onGlobalLayout() {
                possiblyResizeChildOfContent();
            }
        });
        frameLayoutParams = () ();
    }

    private void possiblyResizeChildOfContent() {
        int usableHeightNow = computeUsableHeight();
        if (usableHeightNow != usableHeightPrevious) {
            int usableHeightSansKeyboard = ().getHeight();
            int heightDifference = usableHeightSansKeyboard - usableHeightNow;

             = usableHeightSansKeyboard - heightDifference;

            ();
            usableHeightPrevious = usableHeightNow;
        }
    }

    private int computeUsableHeight() {
        Rect r = new Rect();
        (r);
        if (.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            return ( - );
        }
        return ;
    }
}

然后在setContentView()方法之后调用WindowSoftModeAdjustResizeExecutor.(this) 就ok了。