Редактируемый текст становится сжатым в BottomSheetDialogFragment

#android #android-fragments #android-edittext #keyboard-events #bottom-sheet

#Android #android-фрагменты #android-edittext #клавиатура-события #нижний лист

Вопрос:

У меня есть BottomSheetDialogFragment, в котором простой файл макета с edittext внизу и recyclerview сверху, когда пользователь нажимает на edittext, и открывается программная клавиатура, и пишет несколько строк в edittext и пытается прокрутить его, во время прокрутки, если я нажимаю на любую строку, edittext сжимается сам, а также BottomSheetDialogFragment дергается, как будто он сам рендерится.

Вот мой код

layout_file:

 <RelativeLayout
   android:id="@ id/layout"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="@color/background"
   android:orientation="vertical"
   app:behavior_hideable="true"
   app:layout_behavior="android.support.design.widget.BottomSheetBehavior">
   <android.support.v4.widget.SwipeRefreshLayout
        android:id="@ id/swipeRefreshLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@ id/etPostShare">
        <android.support.v7.widget.RecyclerView
             android:id="@ id/rvNewMessage"
             android:layout_width="match_parent"
             android:layout_height="match_parent"/>

   </android.support.v4.widget.SwipeRefreshLayout>
   <EditText
        android:id="@ id/etPostShare"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="1dp"
        android:background="@null"
        android:gravity="center|left"
        android:hint="Aa"
        android:inputType="textCapSentences|textMultiLine"
        android:isScrollContainer="true"
        android:maxHeight="60dp"
        android:maxLength="@integer/send_chat_txt_limit"
        android:maxLines="4"
        android:paddingLeft="18.4dp"
        android:paddingBottom="10dp"
        android:textSize="14.6sp" />

   </RelativeLayout>
  

Здесь я прикрепил изображения, а также ссылку на видео по моей проблеме:

введите описание изображения здесь

https://drive.google.com/file/d/1bADuzDQoWep8XPMQ4ypKCWJyD32Gtfwp/view?usp=sharing

Комментарии:

1. Пожалуйста, попробуйте заставить ваш ресайклер просматривать содержимое по высоте

2. дайте мне знать, помогает это вам или нет.

3. Не работает @AbhishekBhardwaj

4. swiperefreshlayout и recylerview оба должны иметь свойство wrap_content для height

5. Это не работает, потому что эта кнопка должна отображаться внизу, а recyclerview должен быть поверх кнопки @Jileshl

Ответ №1:

У меня точно такая же проблема. Надеюсь, это работает 🙂

style.xml

 <style name="DialogStyle" parent="Theme.Design.Light.BottomSheetDialog">
    <item name="android:windowIsFloating">false</item> 
    <item name="android:windowSoftInputMode">adjustResize</item>
</style>
  

в вашем BottomSheetDialogFragment

 override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setStyle(DialogFragment.STYLE_NORMAL, R.style.DialogStyle)
}
  

в вашем макете

 <androidx.core.widget.NestedScrollView
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:gravity="bottom"
   android:orientation="vertical">

           .... your content with EditText



  </androidx.core.widget.NestedScrollView>
  

Ответ №2:

Это работает в режиме предварительного просмотра

  <RelativeLayout
            android:id="@ id/layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/holo_red_light"
            android:orientation="vertical"
            app:behavior_hideable="true"
            app:layout_behavior="android.support.design.widget.BottomSheetBehavior">

            <android.support.v4.widget.SwipeRefreshLayout
                android:id="@ id/swipeRefreshLayout"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <android.support.v7.widget.RecyclerView
                    android:id="@ id/rvNewMessage"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"/>

            </android.support.v4.widget.SwipeRefreshLayout>

            <EditText
                android:id="@ id/etPostShare"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="1dp"
                android:background="@null"
                android:gravity="center|left"
                android:layout_alignParentBottom="true"
                android:hint="Aanaa"
                android:inputType="textCapSentences|textMultiLine"
                android:isScrollContainer="true"
                android:maxHeight="60dp"
                android:maxLength="500"
                android:maxLines="4"
                android:paddingLeft="18.4dp"
                android:paddingBottom="10dp"
                android:textSize="14.6sp" />

        </RelativeLayout>
  

Комментарии:

1. Я попробовал ваше решение, но оно снова сжимается при прокрутке в edittext, а затем пользователь нажимает на редактирование любого конкретного символа в edittext.

2. Для меня работает тот же приведенный выше XML; Я вижу, что Edittext плавает над Recyclerview максимум с 4 строками @AsadMukhtar

3. Я знаю, что это выше, но я думаю, что вы не внимательно прочитали вопрос из-за того, что в поведении диалогового окна нижнего листа edittext сжимается.

4. Понял; решение, приведенное выше, я попытался запустить его в своем проекте с поведением макета как bottomsheetbehavior, и оно не уменьшает edittext; Протестировал его на Android 6; Причина, по которой это работает, заключается в том, что; SwipeRefreshLayout не зависит от Edittext для его положения (ваш XML говорит, что ** android: layout_above =»@ id / etPostShare», В то время как вышеупомянутое решение использует относительную конфигурацию макета для отображения в на дне