6

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

waldemar
  • 655
  • 2
  • 10
  • 24

2 Answers2

23

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);
        }
    }
}
ibhavikmakwana
  • 8,948
  • 4
  • 20
  • 39
5

I ended up getting a satisfactory result with the following code: use this in setupDialog(dialog: Dialog, style: Int) method in BottomSheetFragment

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
    }
Mohdroid
  • 381
  • 4
  • 9