带有编辑文本的Bottomsheet通过键盘向上移动

时间:2018-01-17 13:20:50

标签: android android-softkeyboard bottom-sheet

我有底部片段片段向用户回答他的评论。在底部的底部我们有编辑文本,用户可以在其中添加新评论。因此,当软键盘打开时,底部板位于键盘上方,其顶部远离屏幕。但是当键盘打开时,底部应该调整大小。

这是我的代码:

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout

        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <include android:id="@+id/toolbar_layout"
                 layout="@layout/partial_toolbar" />

        <android.support.v7.widget.RecyclerView
            android:id="@+id/list_comments"
            android:layout_below="@+id/toolbar_layout"
            android:layout_width="match_parent"
            android:overScrollMode="always"
            android:layout_height="match_parent"/>

        <View
            android:layout_width="match_parent"
            android:layout_height="3dp"
            android:layout_above="@+id/comment_container"
            android:layout_alignBaseline="@+id/list_comments"
            android:background="@drawable/elevation_bottom"/>


        <LinearLayout
            android:id="@+id/comment_container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#ebffffff"
            android:layout_alignParentBottom="true"
            android:gravity="center_vertical"
            android:orientation="horizontal"
            android:paddingBottom="@dimen/vertical_spacing"
            android:paddingEnd="@dimen/horizontal_spacing"
            android:paddingStart="8dp"
            android:paddingTop="@dimen/vertical_spacing">

            <android.support.v7.widget.AppCompatImageButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@color/transparent"
                android:src="@drawable/ic_add_blue_small"/>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:background="@drawable/bg_message_field"
                android:gravity="center_vertical"
                android:orientation="horizontal">

                <android.support.v7.widget.AppCompatEditText
                    android:id="@+id/edit_comment"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:background="@color/transparent"
                    android:hint="@string/comments_add_comment_hint"
                    android:inputType="textMultiLine"
                    android:maxLength="200"
                    android:maxLines="3"
                    android:minLines="1"
                    android:paddingBottom="8dp"
                    android:paddingEnd="0dp"
                    android:paddingStart="8dp"
                    android:paddingTop="8dp"
                    android:textSize="14sp"
                    app:fontFamily="@font/lora_regular"/>

                <android.support.v7.widget.AppCompatImageButton
                    android:id="@+id/button_send"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_vertical"
                    android:background="@color/transparent"
                    app:srcCompat="@drawable/ic_send_message"/>

            </LinearLayout>

        </LinearLayout>

    </RelativeLayout>

</android.support.design.widget.CoordinatorLayout>

清单上的活动(此活动打开对话框)

    <activity
 android:name=".presentation.ui.category.CategoryDetailsActivity"
android:configChanges="locale|orientation|screenSize|keyboard"
                android:windowSoftInputMode="adjustResize"
                android:windowTranslucentNavigation="true"
                android:windowTranslucentStatus="true"
                android:launchMode="singleTop"
                android:screenOrientation="portrait"
                android:theme="@style/AppTheme.Main.NoActionBar" />

此外,我将此代码放入方法setupDialog

dialog.getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

截图 enter image description here

2 个答案:

答案 0 :(得分:9)

here

得到了这个答案

正如我在其中一个项目中遇到同样的问题一样,

在BottomSheetFragment

中的onCreateDialog中使用它
new KeyboardUtil(getActivity(), rootView);

使用以下课程

public class KeyboardUtil {
    private View decorView;
    private View contentView;
    //a small helper to allow showing the editText focus
    ViewTreeObserver.OnGlobalLayoutListener onGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            Rect r = new Rect();
            //r will be populated with the coordinates of your view that area still visible.
            decorView.getWindowVisibleDisplayFrame(r);

            //get screen height and calculate the difference with the useable area from the r
            int height = decorView.getContext().getResources().getDisplayMetrics().heightPixels;
            int diff = height - r.bottom;

            //if it could be a keyboard add the padding to the view
            if (diff != 0) {
                // if the use-able screen height differs from the total screen height we assume that it shows a keyboard now
                //check if the padding is 0 (if yes set the padding for the keyboard)
                if (contentView.getPaddingBottom() != diff) {
                    //set the padding of the contentView for the keyboard
                    contentView.setPadding(0, 0, 0, diff);
                }
            } else {
                //check if the padding is != 0 (if yes reset the padding)
                if (contentView.getPaddingBottom() != 0) {
                    //reset the padding of the contentView
                    contentView.setPadding(0, 0, 0, 0);
                }
            }
        }
    };

    public KeyboardUtil(Activity act, View contentView) {
        this.decorView = act.getWindow().getDecorView();
        this.contentView = contentView;

        //only required on newer android versions. it was working on API level 19
        if (Build.VERSION.SDK_INT >= 19) {
            decorView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener);
        }
    }

    /**
     * Helper to hide the keyboard
     *
     * @param act
     */
    public static void hideKeyboard(Activity act) {
        if (act != null && act.getCurrentFocus() != null) {
            InputMethodManager inputMethodManager = (InputMethodManager) act.getSystemService(Activity.INPUT_METHOD_SERVICE);
            inputMethodManager.hideSoftInputFromWindow(act.getCurrentFocus().getWindowToken(), 0);
        }
    }

    public void enable() {
        if (Build.VERSION.SDK_INT >= 19) {
            decorView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener);
        }
    }

    public void disable() {
        if (Build.VERSION.SDK_INT >= 19) {
            decorView.getViewTreeObserver().removeOnGlobalLayoutListener(onGlobalLayoutListener);
        }
    }
}

答案 1 :(得分:3)

使用以下代码我最终获得了令人满意的结果: 在BottomSheetFragment中的setupDialog(dialog:Dialog,style:Int)方法中使用它

dialog.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
    dialog.setOnShowListener {
        val bottomSheetDialog = dialog as BottomSheetDialog
        val bottomSheet = bottomSheetDialog.findViewById<View>(android.support.design.R.id.design_bottom_sheet) as FrameLayout?
        BottomSheetBehavior.from(bottomSheet!!).state = BottomSheetBehavior.STATE_EXPANDED
    }