AndroidサポートBottomSheetBehaviorを動的にすることはできませんか?

私は次のような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内にすべての子ビューを追加すると、すべてが正常に機能します。プログラムでビューを動的に追加しようとすると、機能しません。

誰かが同様の問題を抱えていましたか?

Volchik

拡張サイズ計算の実装に関連するBottomSheetBehaviorの動的コンテンツに関する問題。BottomSheetBehaviorは、onLayoutChildメソッドで拡張サイズを計算します。ただし、シートレイアウトの内容を変更すると、プロセスは非同期で起動します。RequestLayoutなどを呼び出しても。したがって、呼び出しの結果は次のようになります。

  1. BottomSheetBehaviorには古い拡張サイズがあります(あなたの場合はゼロだと思います)
  2. BottomSheetにコンテンツを追加します。拡大サイズはまだ古いです。
  3. SetStateをEXPANDEDに呼び出します。BottomSheetBehaviorは、古い拡張サイズを引き続き記憶し、そのサイズでアニメーションを起動します。状態がSTATE_SETTLINGに変更されました!
  4. onLayoutChildが呼び出され、BottomSheetBehaviorが新しい拡張サイズを計算します。ただし、アニメーションはすでに進行中であり、状態はSTATE_SETTLINGであるため、BottomSheetBehaviorはそのサイズを変更しません
  5. アニメーションが終了しました。BottomSheetのサイズが古いです。状態はEXPANDEDに変更されましたが、BottomSheetBehaviorは、アニメーション中に拡張サイズが変更されたことを「忘れました」。

それは確かに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]

編集
0

コメントを追加

0

関連記事

分類Dev

Android Studioにサポートリポジトリをインストールしてプロジェクトを同期することはできません

分類Dev

Android Studioにサポートリポジトリをインストールしてプロジェクトを同期することはできません

分類Dev

Android Studioにサポートリポジトリをインストールしてプロジェクトを同期することはできません

分類Dev

スマートポインターを生のポインターとして自動的に使用することはできませんか?

分類Dev

関数を名前空間にインポートすることはできますが、エクスポートすることはできませんか?

分類Dev

Nginxをポート80で動作させることができません。他のポートでは正常に動作します

分類Dev

Android:httpsサイトにjsonを印刷することはできません

分類Dev

MakefileでGCCにサポートされている最新の標準を自動的に使用させることはできますか?

分類Dev

Thunderboltケーブルを「TB3」にすることはできますか?40GB /秒をサポートしていません

分類Dev

ScipyをJupyterNotebookにインポートすることはできません

分類Dev

fiddlerコアの自動ストリーミングを無効にすることはできませんか?

分類Dev

vscode:nodemonで起動するときに、VisualStudioコードでブレークポイントを壊すことはできません

分類Dev

コンポーネントからサービスにデータを渡すことができません

分類Dev

Ubuntu 16.04は、ネットワークマネージャーサービスを再起動せずにVPNに再接続することはできません

分類Dev

Alpine Linux の sshuttle が「サポートされているメソッドを自動的に見つけることができません」で失敗する

分類Dev

再起動せずにユーザーをグループに追加することはできませんか?

分類Dev

Twitterボタンで完全な言語サポートを取得することはできません

分類Dev

Twitterボタンで完全な言語サポートを取得することはできません

分類Dev

Androidサービスに複数のセンサーを登録することはできません

分類Dev

ルームデータベースを動的にクエリすることはLiveDataをサポートしていませんか?

分類Dev

Dahsboardで、動画を個別に削除することはできませんか?

分類Dev

AndroidでReactNativeを使用すると、axiosはgzipをサポートできませんでした

分類Dev

Android res / xmlは、アポストロフィをエスケープすることはできません

分類Dev

2つのソケットで同じポートを使用することはできませんか?

分類Dev

データを正常に書き込むことはできますが、サーバーからデータを読み取ることはできません

分類Dev

トレイトをエクスポートして使用することはできませんserdeからDeserialize

分類Dev

terminfoをオーバーライドしてtmuxでTrueColorサポートを有効にすることはできません

分類Dev

レポートのコントロールを明示的に参照することはできません(MS Access / VBA)

分類Dev

「GestureDetectorCompat」クラスをインポートすることはできません

Related 関連記事

  1. 1

    Android Studioにサポートリポジトリをインストールしてプロジェクトを同期することはできません

  2. 2

    Android Studioにサポートリポジトリをインストールしてプロジェクトを同期することはできません

  3. 3

    Android Studioにサポートリポジトリをインストールしてプロジェクトを同期することはできません

  4. 4

    スマートポインターを生のポインターとして自動的に使用することはできませんか?

  5. 5

    関数を名前空間にインポートすることはできますが、エクスポートすることはできませんか?

  6. 6

    Nginxをポート80で動作させることができません。他のポートでは正常に動作します

  7. 7

    Android:httpsサイトにjsonを印刷することはできません

  8. 8

    MakefileでGCCにサポートされている最新の標準を自動的に使用させることはできますか?

  9. 9

    Thunderboltケーブルを「TB3」にすることはできますか?40GB /秒をサポートしていません

  10. 10

    ScipyをJupyterNotebookにインポートすることはできません

  11. 11

    fiddlerコアの自動ストリーミングを無効にすることはできませんか?

  12. 12

    vscode:nodemonで起動するときに、VisualStudioコードでブレークポイントを壊すことはできません

  13. 13

    コンポーネントからサービスにデータを渡すことができません

  14. 14

    Ubuntu 16.04は、ネットワークマネージャーサービスを再起動せずにVPNに再接続することはできません

  15. 15

    Alpine Linux の sshuttle が「サポートされているメソッドを自動的に見つけることができません」で失敗する

  16. 16

    再起動せずにユーザーをグループに追加することはできませんか?

  17. 17

    Twitterボタンで完全な言語サポートを取得することはできません

  18. 18

    Twitterボタンで完全な言語サポートを取得することはできません

  19. 19

    Androidサービスに複数のセンサーを登録することはできません

  20. 20

    ルームデータベースを動的にクエリすることはLiveDataをサポートしていませんか?

  21. 21

    Dahsboardで、動画を個別に削除することはできませんか?

  22. 22

    AndroidでReactNativeを使用すると、axiosはgzipをサポートできませんでした

  23. 23

    Android res / xmlは、アポストロフィをエスケープすることはできません

  24. 24

    2つのソケットで同じポートを使用することはできませんか?

  25. 25

    データを正常に書き込むことはできますが、サーバーからデータを読み取ることはできません

  26. 26

    トレイトをエクスポートして使用することはできませんserdeからDeserialize

  27. 27

    terminfoをオーバーライドしてtmuxでTrueColorサポートを有効にすることはできません

  28. 28

    レポートのコントロールを明示的に参照することはできません(MS Access / VBA)

  29. 29

    「GestureDetectorCompat」クラスをインポートすることはできません

ホットタグ

アーカイブ