私は次のようなAndroidサポートライブラリのボトムシートを使用しています:
XML:
<LinearLayout
android:id="@+id/bottomSheetLinearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/fourth_white"
android:orientation="vertical"
app:layout_behavior="android.support.design.widget.BottomSheetBehavior" />
LinearLayoutに子ビューを追加します。
bottomSheet.addView(actionButtonView);
子ビューの追加が完了したら、BottomSheetBehaviorを初期化して展開します。
BottomSheetBehavior sheetBehavior = BottomSheetBehavior.from(bottomSheet);
sheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
これは機能しません。何も表示されません。XML内でLinearLayoutの高さを事前設定しても、すべて白です。
XMLのLinearLayout内にすべての子ビューを追加すると、すべてが正常に機能します。プログラムでビューを動的に追加しようとすると、機能しません。
誰かが同様の問題を抱えていましたか?
拡張サイズ計算の実装に関連するBottomSheetBehaviorの動的コンテンツに関する問題。BottomSheetBehaviorは、onLayoutChildメソッドで拡張サイズを計算します。ただし、シートレイアウトの内容を変更すると、プロセスは非同期で起動します。RequestLayoutなどを呼び出しても。したがって、呼び出しの結果は次のようになります。
それは確かにBottomSheetBehaviour実装のバグです。
私のプロジェクトでは、そのような回避策を見つけました:
private void showPanel(final View panelContent) {
if (panelBehavior.getState()!=BottomSheetBehavior.STATE_EXPANDED) {
panelBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(final View bottomSheet, int newState) {
if (newState==BottomSheetBehavior.STATE_EXPANDED) {
panelBehavior.setBottomSheetCallback(null);
contentView.removeAllViews();
contentView.addView(panelContent);
panelView.setVisibility(View.VISIBLE);
}
}
@Override
public void onSlide(View bottomSheet, float slideOffset) {
}
});
panelBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
return;
}
contentView.removeAllViews();
contentView.addView(panelContent);
panelView.setVisibility(View.VISIBLE);
}
private void hidePanel() {
panelBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
panelView.setVisibility(View.GONE);
contentView.removeAllViews();
}
したがって、新しいコンテンツでBottomSheetを表示する必要がある場合は、ShowPanelを呼び出します。BottomSheetを完全に非表示にする必要がある場合は、hidePanelを呼び出します(プロジェクトで非表示にする必要がある場合。そうでない場合は、メソッドからsetVisibilityを削除できます)。
回避策の考え方は、BottomSheetBehaviorが展開された状態でないときに、BottomSheetのコンテンツを決して変更しないことです。状態が展開されていない場合は、展開に変更し、アニメーションが終了するまで待ってから、コンテンツを変更します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加