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