Search code examples
androidandroid-softkeyboardbottom-sheet

Bottomsheet with edit text moved up by keyboard


I have bottomsheet fragment what shows to user answears to his comment. At the bottom of bottom sheet we have edit text, where user can add new comment. So, when soft keyboard opened the bottomsheet staes above keyboard and its top moved far beyond the screen. But bottom sheet should to resize when keyboard is open.

Here is my code:

<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 at manifest (this activity opens dialog)

    <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" />

Also I put this code to method setupDialog

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

And screenshots enter image description here


Solution

  • Got this answer from here

    As I too had the same issue in one of my projects,

    Use this in onCreateDialog in BottomSheetFragment

    new KeyboardUtil(getActivity(), rootView);
    

    By using the below class

    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);
            }
        }
    }