首页 文章

软键盘出现时如何调整布局

提问于
浏览
126

当软键盘激活时,我想调整/重新调整布局大小,如下所示:

Before and After:

enter image description here

enter image description here


在SO中找到了几个资源:


但问题和答案相当模糊,这里的问题是我想要的更清晰的画面 .

Requirements:

  • 它应该适用于任何屏幕尺寸的手机 .

  • 注意到"FACEBOOK"和"Sign Up for Facebook"处的边距/填充空间在之前和之后发生了变化 .

  • 不涉及滚动视图 .

11 回答

  • 2

    只需添加

    android:windowSoftInputMode="adjustResize"
    

    在AndroidManifest.xml中,您声明此特定活动,这将调整布局调整大小选项 .

    enter image description here

    下面的一些源代码用于布局设计

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="20dp"
            android:text="FaceBook"
            android:textAppearance="?android:attr/textAppearanceLarge" />
    
        <EditText
            android:id="@+id/editText1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/textView1"
            android:layout_marginTop="30dp"
            android:ems="10"
            android:hint="username" >
    
            <requestFocus />
        </EditText>
    
        <EditText
            android:id="@+id/editText2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/editText1"
            android:layout_marginTop="20dp"
            android:ems="10"
            android:hint="password" />
    
        <Button
            android:id="@+id/button1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/editText2"
            android:layout_centerHorizontal="true"
            android:layout_marginLeft="18dp"
            android:layout_marginTop="20dp"
            android:text="Log In" />
    
        <TextView
            android:id="@+id/textView2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_marginTop="17dp"
            android:gravity="center"
            android:text="Sign up for facebook"
            android:textAppearance="?android:attr/textAppearanceLarge" />
    
    </RelativeLayout>
    
  • 10

    这个问题已经在几年前被问过了,“秘密Andro Geni”有一个很好的基础解释,“tir38”也对完整的解决方案做了很好的尝试,但是这里没有完整的解决方案 . 我花了几个小时搞清楚事情,这是我的完整解决方案,底部有详细解释:

    <?xml version="1.0" encoding="utf-8"?>
    <ScrollView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true">
    
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="10dp">
    
            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_above="@+id/mainLayout"
                android:layout_alignParentTop="true"
                android:id="@+id/headerLayout">
    
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_centerVertical="true"
                    android:gravity="center_horizontal">
    
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:id="@+id/textView1"
                        android:text="facebook"
                        android:textStyle="bold"
                        android:ellipsize="marquee"
                        android:singleLine="true"
                        android:textAppearance="?android:attr/textAppearanceLarge" />
    
                </LinearLayout>
    
            </RelativeLayout>
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:id="@+id/mainLayout"
                android:orientation="vertical">
    
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:id="@+id/editText1"
                    android:ems="10"
                    android:hint="Email or Phone"
                    android:inputType="textVisiblePassword">
    
                    <requestFocus />
                </EditText>
    
                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="10dp"
                    android:id="@+id/editText2"
                    android:ems="10"
                    android:hint="Password"
                    android:inputType="textPassword" />
    
                <Button
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="10dp"
                    android:id="@+id/button1"
                    android:text="Log In"
                    android:onClick="login" />
    
            </LinearLayout>
    
            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_below="@+id/mainLayout"
                android:id="@+id/footerLayout">
    
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_alignParentBottom="true">
    
                    <RelativeLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content">
    
                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:id="@+id/textView2"
                            android:text="Sign Up for Facebook"
                            android:layout_centerHorizontal="true"
                            android:layout_alignBottom="@+id/helpButton"
                            android:ellipsize="marquee"
                            android:singleLine="true"
                            android:textAppearance="?android:attr/textAppearanceSmall" />
    
                        <Button
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_alignParentRight="true"
                            android:id="@+id/helpButton"
                            android:text="\?"
                            android:onClick="help" />
    
                    </RelativeLayout>
    
                </LinearLayout>
    
            </RelativeLayout>
    
        </RelativeLayout>
    
    </ScrollView>
    

    AndroidManifest.xml 中,不要忘记设置:

    android:windowSoftInputMode="adjustResize"
    

    <activity> 标签上,您想要这样的布局 .

    Thoughts:

    我已经意识到 RelativeLayout 是跨越所有可用空间的布局,然后在键盘弹出时调整大小 .

    并且 LinearLayout 是在调整大小过程中未调整大小的布局 .

    这就是为什么你需要在 ScrollView 之后立即拥有1 RelativeLayout 来跨越所有可用的屏幕空间 . 并且你需要在 RelativeLayout 内部 LinearLayout 否则你的内部会在调整大小时被压碎 . 好的例子是"headerLayout" . 如果内部没有 LinearLayout ,那么 RelativeLayout "facebook"文本会被粉碎而不会显示 .

    在问题中发布的“facebook”登录图片中,我还注意到整个登录部分(mainLayout)相对于整个屏幕是垂直居中的,因此属性:

    android:layout_centerVertical="true"
    

    LinearLayout 布局上 . 因为mainLayout位于 LinearLayout 内,这意味着该部分不会调整大小(再次查看相关图片) .

  • 14

    在您的Manifest中添加此行,您的Activity将被调用

    android:windowSoftInputMode="adjustPan|adjustResize"
    

    要么

    你可以在 onCreate 中添加这一行

    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE|WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
    
  • 1

    Android Developer有正确的答案,但提供的源代码非常冗长,并没有实际实现图中描述的模式 .

    这是一个更好的模板:

    <?xml version="1.0" encoding="utf-8"?>
    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fillViewport="true">
    
        <RelativeLayout android:layout_width="match_parent"
                        android:layout_height="match_parent">
    
            <LinearLayout android:layout_width="match_parent"
                          android:layout_height="wrap_content"
                          android:orientation="vertical">
    
                    <!-- stuff to scroll -->
    
            </LinearLayout>
    
            <FrameLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true">
    
                <!-- footer -->
    
            </FrameLayout>
    
        </RelativeLayout>
    
    </ScrollView>
    

    由您来决定用于"scrolling"和"footer"部分的视图 . 也知道你可能要设置 ScrollView s fillViewPort .

  • 28

    这使得可以显示以前由键盘隐藏的任何想要的布局 .

    将其添加到AndroidManifest.xml中的activity标记中

    android:windowSoftInputMode =“adjustResize”

    使用ScrollView环绕根视图,最好使用scrollbars = none . 除了用于解决此问题之外,ScrollView将不会更改您的布局 .

    然后在要在键盘上方完全显示的视图上设置fitsSystemWindows =“true” . 这将使您的EditText在键盘上方可见,并且可以向下滚动到EditText下面的部分,但在视图中使用fitsSystemWindows =“true” .

    android:fitsSystemWindows =“true”

    例如:

    <ScrollView
        android:id="@+id/scrollView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="none">
    
        <android.support.constraint.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:fitsSystemWindows="true">
    
            ...
    
        </android.support.constraint.ConstraintLayout>
    </ScrollView>
    

    如果要在键盘出现的那一刻显示键盘上方的完整部分fitsSystemWindows =“true”视图,则需要一些代码将视图滚动到底部:

    // Code is in Kotlin
    
    setupKeyboardListener(scrollView) // call in OnCreate or similar
    
    
    private fun setupKeyboardListener(view: View) {
        view.viewTreeObserver.addOnGlobalLayoutListener {
            val r = Rect()
            view.getWindowVisibleDisplayFrame(r)
            if (Math.abs(view.rootView.height - (r.bottom - r.top)) > 100) { // if more than 100 pixels, its probably a keyboard...
                onKeyboardShow()
            }
        }
    }
    
    private fun onKeyboardShow() {
        scrollView.scrollToBottomWithoutFocusChange()
    }
    
    fun ScrollView.scrollToBottomWithoutFocusChange() { // Kotlin extension to scrollView
        val lastChild = getChildAt(childCount - 1)
        val bottom = lastChild.bottom + paddingBottom
        val delta = bottom - (scrollY + height)
        smoothScrollBy(0, delta)
    }
    

    完整布局示例:

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="true">
    
        <RelativeLayout
            android:id="@+id/statisticsLayout"
            android:layout_width="match_parent"
            android:layout_height="340dp"
            android:background="@drawable/some"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">
    
            <ImageView
                android:id="@+id/logoImageView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="64dp"
                android:src="@drawable/some"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />
    
        </RelativeLayout>
    
        <RelativeLayout
            android:id="@+id/authenticationLayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginEnd="32dp"
            android:layout_marginStart="32dp"
            android:layout_marginTop="20dp"
            android:focusableInTouchMode="true"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/statisticsLayout">
    
            <android.support.design.widget.TextInputLayout
                android:id="@+id/usernameEditTextInputLayout"
                android:layout_width="match_parent"
                android:layout_height="68dp">
    
                <EditText
                    android:id="@+id/usernameEditText"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" />
    
            </android.support.design.widget.TextInputLayout>
    
            <android.support.design.widget.TextInputLayout
                android:id="@+id/passwordEditTextInputLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_below="@id/usernameEditTextInputLayout">
    
                <EditText
                    android:id="@+id/passwordEditText"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" />
    
            </android.support.design.widget.TextInputLayout>
    
            <Button
                android:id="@+id/loginButton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@id/passwordEditTextInputLayout"
                android:layout_centerHorizontal="true"
                android:layout_marginBottom="10dp"
                android:layout_marginTop="20dp" />
    
            <Button
                android:id="@+id/forgotPasswordButton"
                android:layout_width="wrap_content"
                android:layout_height="40dp"
                android:layout_below="@id/loginButton"
                android:layout_centerHorizontal="true" />
    
        </RelativeLayout>
    
    </android.support.constraint.ConstraintLayout>
    
  • 156

    It can work for all kind of layout.

    • 将此添加到 AndroidManifest.xml 中的活动代码

    android:windowSoftInputMode =“adjustResize”

    例如:

    <activity android:name=".ActivityLogin"
        android:screenOrientation="portrait"
        android:theme="@style/AppThemeTransparent"
        android:windowSoftInputMode="adjustResize"/>
    
    • activitypage.xml 中的布局标签上添加此项将更改其位置 .

    android:fitsSystemWindows =“true”

    android:layout_alignParentBottom =“true”

    例如:

    <RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:fitsSystemWindows="true">
    
  • 0

    在我的情况下它有所帮助 .

    main_layout.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:orientation="vertical"
        tools:context="com.livewallpaper.profileview.loginact.Main2Activity">
    
    <TextView
        android:layout_weight="1"
        android:layout_width="match_parent"
        android:text="Title"
        android:gravity="center"
        android:layout_height="0dp" />
    <LinearLayout
        android:layout_weight="1"
        android:layout_width="match_parent"
        android:layout_height="0dp">
        <EditText
            android:hint="enter here"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>
    <TextView
        android:layout_weight="1"
        android:text="signup for App"
        android:gravity="bottom|center_horizontal"
        android:layout_width="match_parent"
        android:layout_height="0dp" />
    </LinearLayout>
    

    manifest 文件中使用此选项

    <activity android:name=".MainActivity"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="adjustResize"/>
    

    现在最重要的部分!在 ActivityApplication 标记中使用这样的主题 .

    android:theme="@style/AppTheme"
    

    主题就是这样的

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="windowActionModeOverlay">true</item>
    </style>
    

    所以我错过了这个主题 . 这让我整天感到沮丧 .

  • 2

    您只需在AndroidManifest.xml文件中设置这些选项即可 .

    <activity
        android:name=".YourACtivityName"
        android:windowSoftInputMode="stateVisible|adjustResize">
    

    建议不要使用 adjustPan ,因为用户可能需要关闭键盘才能看到所有输入字段 .

    更多信息:Android App Manifest

  • 4

    对我来说,它适用于这行代码:

    getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
    

    只需将其放入onCreate方法即可 . 最好!

  • 4

    很多答案都是对的 . 在 AndroidManifest 我写道:

    <activity
        android:name=".SomeActivity"
        android:configChanges="orientation|keyboardHidden|screenSize" // Optional, doesn't affect.
        android:theme="@style/AppTheme.NoActionBar"
        android:windowSoftInputMode="adjustResize" />
    

    在我的情况下,我在 styles.xml 中添加了一个主题,但您可以使用自己的主题:

    <style name="AppTheme.NoActionBar" parent="AppTheme">
        <!--  Hide ActionBar -->
        <item name="windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
    </style>
    

    我注意到如果我使用全屏主题,则不会发生调整大小:

    <style name="AppTheme.FullScreenTheme" parent="AppTheme">
        <!--  Hide ActionBar -->
        <item name="windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
        <!--  Hide StatusBar -->
        <item name="android:windowFullscreen">true</item>
    </style>
    

    在我的情况下 adjustResize 工作,但 adjustPan 没有 .

    对于 full-screen layouts ,请参阅Android How to adjust layout in Full Screen Mode when softkeyboard is visiblehttps://gist.github.com/grennis/2e3cd5f7a9238c59861015ce0a7c5584中的变通方法 .

    也是https://medium.com/@sandeeptengale/problem-solved-3-android-full-screen-view-translucent-scrollview-adjustresize-keyboard-b0547c7ced32的作品,但是它的StatusBar是透明的,因此可以看到电池,时钟,Wi-Fi图标 .

    如果使用“文件”>“新建”>“活动”>“全屏活动”创建活动,则使用代码中的位置:

    fullscreen_content.systemUiVisibility =
        View.SYSTEM_UI_FLAG_LOW_PROFILE or
        View.SYSTEM_UI_FLAG_FULLSCREEN or
        View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
        View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY or
        View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or
        View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
    

    你也不会取得成果 . 您可以在根容器中使用 android:fitsSystemWindows="true" ,但会显示StatusBar . 因此,请使用第一个链接中的变通方法 .

  • 1

    我使用这个扩展类框架当我需要重新计算高度大小onLayout时,我覆盖onmeasure并使用getKeyboardHeight()减去keyboardHeight

    我的创建框架需要使用软键盘调整大小

    SizeNotifierFrameLayout frameLayout = new SizeNotifierFrameLayout(context) {
                private boolean first = true;
    
                @Override
                protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
                    super.onLayout(changed, left, top, right, bottom);
    
                    if (changed) {
                        fixLayoutInternal(first);
                        first = false;
                    }
                }
    
                @Override
                protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
                    super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(heightMeasureSpec) - getKeyboardHeight(), MeasureSpec.EXACTLY));
                }
    
                @Override
                protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
                    boolean result = super.drawChild(canvas, child, drawingTime);
                    if (child == actionBar) {
                        parentLayout.drawHeaderShadow(canvas, actionBar.getMeasuredHeight());
                    }
                    return result;
                }
    
    
            };
    

    SizeNotifierFrameLayout

    public class SizeNotifierFrameLayout extends FrameLayout {
    
        public interface SizeNotifierFrameLayoutDelegate {
            void onSizeChanged(int keyboardHeight, boolean isWidthGreater);
        }
    
        private Rect                            rect            = new Rect();
        private Drawable                        backgroundDrawable;
        private int                             keyboardHeight;
        private int                             bottomClip;
        private SizeNotifierFrameLayoutDelegate delegate;
        private boolean                         occupyStatusBar = true;
    
        public SizeNotifierFrameLayout(Context context) {
            super(context);
            setWillNotDraw(false);
        }
    
        public Drawable getBackgroundImage() {
            return backgroundDrawable;
        }
    
        public void setBackgroundImage(Drawable bitmap) {
            backgroundDrawable = bitmap;
            invalidate();
        }
    
        public int getKeyboardHeight() {
            View rootView = getRootView();
            getWindowVisibleDisplayFrame(rect);
            int usableViewHeight = rootView.getHeight() - (rect.top != 0 ? AndroidUtilities.statusBarHeight : 0) - AndroidUtilities.getViewInset(rootView);
            return usableViewHeight - (rect.bottom - rect.top);
        }
    
        public void notifyHeightChanged() {
            if (delegate != null) {
                keyboardHeight = getKeyboardHeight();
                final boolean isWidthGreater = AndroidUtilities.displaySize.x > AndroidUtilities.displaySize.y;
                post(new Runnable() {
                    @Override
                    public void run() {
                        if (delegate != null) {
                            delegate.onSizeChanged(keyboardHeight, isWidthGreater);
                        }
                    }
                });
            }
        }
    
        public void setBottomClip(int value) {
            bottomClip = value;
        }
    
        public void setDelegate(SizeNotifierFrameLayoutDelegate delegate) {
            this.delegate = delegate;
        }
    
        public void setOccupyStatusBar(boolean value) {
            occupyStatusBar = value;
        }
    
        protected boolean isActionBarVisible() {
            return true;
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            if (backgroundDrawable != null) {
                if (backgroundDrawable instanceof ColorDrawable) {
                    if (bottomClip != 0) {
                        canvas.save();
                        canvas.clipRect(0, 0, getMeasuredWidth(), getMeasuredHeight() - bottomClip);
                    }
                    backgroundDrawable.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight());
                    backgroundDrawable.draw(canvas);
                    if (bottomClip != 0) {
                        canvas.restore();
                    }
                } else if (backgroundDrawable instanceof BitmapDrawable) {
                    BitmapDrawable bitmapDrawable = (BitmapDrawable) backgroundDrawable;
                    if (bitmapDrawable.getTileModeX() == Shader.TileMode.REPEAT) {
                        canvas.save();
                        float scale = 2.0f / AndroidUtilities.density;
                        canvas.scale(scale, scale);
                        backgroundDrawable.setBounds(0, 0, (int) Math.ceil(getMeasuredWidth() / scale), (int) Math.ceil(getMeasuredHeight() / scale));
                        backgroundDrawable.draw(canvas);
                        canvas.restore();
                    } else {
                        int actionBarHeight =
                                (isActionBarVisible() ? ActionBar.getCurrentActionBarHeight() : 0) + (Build.VERSION.SDK_INT >= 21 && occupyStatusBar ? AndroidUtilities.statusBarHeight : 0);
                        int   viewHeight = getMeasuredHeight() - actionBarHeight;
                        float scaleX     = (float) getMeasuredWidth() / (float) backgroundDrawable.getIntrinsicWidth();
                        float scaleY     = (float) (viewHeight + keyboardHeight) / (float) backgroundDrawable.getIntrinsicHeight();
                        float scale      = scaleX < scaleY ? scaleY : scaleX;
                        int   width      = (int) Math.ceil(backgroundDrawable.getIntrinsicWidth() * scale);
                        int   height     = (int) Math.ceil(backgroundDrawable.getIntrinsicHeight() * scale);
                        int   x          = (getMeasuredWidth() - width) / 2;
                        int   y          = (viewHeight - height + keyboardHeight) / 2 + actionBarHeight;
                        canvas.save();
                        canvas.clipRect(0, actionBarHeight, width, getMeasuredHeight() - bottomClip);
                        backgroundDrawable.setBounds(x, y, x + width, y + height);
                        backgroundDrawable.draw(canvas);
                        canvas.restore();
                    }
                }
            } else {
                super.onDraw(canvas);
            }
        }
    
        @Override
        protected void onLayout(boolean changed, int l, int t, int r, int b) {
            super.onLayout(changed, l, t, r, b);
            notifyHeightChanged();
        }
    }
    

相关问题