Высота Android Bottomsheet TextView не регулируется при первом расширении

TL;DR: TextView в Bottomsheet не показывает перенос многострочного текста при первом раскрытии Bottomsheet, но настраивается после его свертывания.

Поэтому я использую нижний лист из библиотеки design-23.2.1.

Мой файл макета выглядит так:

<android.support.design.widget.CoordinatorLayout>

    ......

    <LinearLayout
        android:id="@+id/bottom_sheet"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:behavior_peekHeight="@dimen/bottom_sheet_peek_height"
        app:layout_behavior="android.support.design.widget.BottomSheetBehavior"/>
</android.support.design.widget.CoordinatorLayout>

Содержимое Bottomsheet в основном представляет собой список:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    <TextView 
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:singleLine="false" />
    ...
</LinearLayout>

Проблема заключается в том, что всякий раз, когда Bottomsheet устанавливается на STATE_EXPANDED в первый раз, TextView является одной строкой, а текст переносится, а в конце строки нет многоточия .

Затем, после того, как он установлен на STATE_COLLAPSED, высота TextView в порядке и правильно многострочная.

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

Обходной путь представлен здесь. Я последовал за ним и добавил это:

bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
    @Override
    public void onStateChanged(@NonNull View bottomSheet, int newState) {
        if (newState == BottomSheetBehavior.STATE_EXPANDED) {
            bottomSheetBehavior.onLayoutChild(coordinatorLayout,
                                            bottomSheetView,
                                            ViewCompat.LAYOUT_DIRECTION_LTR);
        }
    }
    ........
}

На самом деле это заставило перенастроить высоту, когда Bottomsheet расширяется в первый раз. Однако это произошло внезапно сразу после завершения анимации расширения.

Есть ли способ отрегулировать высоту перед расширяющейся анимацией, как это делает Google Map?

Обновить

Я обнаружил, что эта проблема связана с тем, что я установил Bottomsheet на STATE_COLLAPSED до того, как он был расширен. Если это не было установлено, проблема исчезла, и высота отрегулирована правильно с первого раза.

Теперь мой вопрос: зачем устанавливать его на STATE_COLLAPSED, прежде чем расширение вызовет эту проблему?


person Peike    schedule 27.03.2016    source источник
comment
Вы пробовали это с последней версией (24.0.0 на данный момент)?   -  person ianhanniballake    schedule 26.06.2016


Ответы (2)


если по какой-то причине вам все еще приходится использовать старую библиотеку поддержки, вот обходной путь для этого.

mBottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
        @Override
        public void onStateChanged(@NonNull final View bottomSheet, int newState) {
            bottomSheet.post(new Runnable() {
                @Override
                public void run() {
                    //workaround for the bottomsheet  bug
                    bottomSheet.requestLayout();
                    bottomSheet.invalidate();
                }
            });
        }

        @Override
        public void onSlide(@NonNull View bottomSheet, float slideOffset) {
        }
    });
person Ankush Chugh    schedule 26.10.2016

После перехода на библиотеку дизайна 24.0.0 проблема больше не воспроизводится.

Спасибо за усилия команды Android, которые делают нашу жизнь проще и легче.

person Peike    schedule 27.06.2016