Android Bottomsheet TextView高度未在首次展开时调整

TL; DR:Bottomsheet中的TextView在第一次展开Bottomsheet时没有显示包装的多行文本,但在折叠后自行调整.

所以我使用了design-23.2.1库中的Bottomsheet.

我的布局文件如下所示:

<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之后发生了高度重新布局,因为我将它从折叠中滑出并且多行已经存在.

提供了一个解决方法here.我跟着它并添加了这个:

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第一次展开时,它确实使高度重新调整.然而,它在扩展动画完成后突然发生.

有没有办法在扩展动画之前调整高度,就像谷歌地图一样?

更新

我发现这个问题是因为我在扩展之前将Bottomsheet设置为STATE_COLLAPSED.如果没有设置那么问题就会消失,第一次正确调整高度.

现在我的问题是:为什么在扩展之前将它设置为STATE_COLLAPSED会导致该问题?

最佳答案 如果由于某种原因你仍然需要使用旧的支持库,这里是解决方法.

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) {
        }
    });
点赞