2016-02-28 64 views
20

Googleが最近リリースしたAppCompat v23.2のBottomSheetBehaviorを使用しています。私のボトムシートの高さは、ボトムシートの内側に表示されるコンテンツに依存します(Googleがマップアプリケーションで行うことと同様)。BottomSheetBehaviorの高さを動的に変更

最初に読み込まれたデータはうまく動作しますが、アプリケーションで実行時に表示される内容が変更され、その結果、下端のシートが古い高さに保持され、底面の未使用領域または切り口が生じます。

拡張状態に使用する高さ(ViewGroupの高さがMATCH_HEIGHTに設定されている場合)や手動で必要な高さを設定する方法を、下のシートレイアウトに通知する方法はありますか?


EDIT:私は手動でもViewGroupとその親ではなく、任意の成功なしinvalidate()を呼び出そうとしました。

+0

あなたはwrap_parentに設定ビューの高さを行い、その後、あなたのコンテンツが –

+0

ビューの高さがwrap_parentに設定されてロードされますが、私の問題は、ビューが無効にされると、それはの高さを再計算しないということですされた後、ビューを無効にする可能性それと下のシートは以前と同じ状態を保ちます – miho

+0

BottomSheetBehaviorのコードを見ると、CoordinatorLayoutによって呼び出されるonLayoutChildメソッドの高さが計算されます。 requestLayout()を呼び出して無効化しようとしましたか? – mattmook

答えて

6

これにはBottomSheetBehavior#setPeekHeightを使用できます。

FrameLayout bottomSheet = (FrameLayout) findViewById(R.id.bottom_sheet); 
BottomSheetBehavior<FrameLayout> behavior = BottomSheetBehavior.from(bottomSheet); 
behavior.setPeekHeight(newHeight); 

これは、自動的に底部シートをピーク高さに移動しません。 BottomSheetBehavior#setStateに電話して、ボトムシートを新しいピーク高さに調整することができます。

behavior.setState(BottomSheetBehavior.STATE_COLLAPSED); 
+1

いいえ、私が探しているのは拡張サイズです。私はすでに覗き見の高さで折りたたまれた状態を使用しています。しかし、私のピークサイズは常にプレビューヘッダーに限られており、展開されるサイズは利用可能なコンテンツの量によって異なります。 (例えばオブジェクトの説明のために) – miho

19

私はRelativeLayoutと同じ問題がありました。高さは再計算されません。新しい再計算された値で高さを設定し、BottomSheetBehavior.onLayoutChildと呼ぶ必要がありました。

これは私の一時的な解決策である:私はBottomSheet内部recyclerviewを使用してアイテムを動的に変更するとき、私は同じ問題に直面していた

coordinatorLayout = (CoordinatorLayout)findViewById(R.id.coordinator_layout); 
bottomSheet = findViewById(R.id.bottom_sheet); 

int accountHeight = accountTextView.getHeight(); 
accountTextView.setVisibility(View.GONE); 

bottomSheet.getLayoutParams().height = bottomSheet.getHeight() - accountHeight; 
bottomSheet.requestLayout(); 
behavior.onLayoutChild(coordinatorLayout, bottomSheet, ViewCompat.LAYOUT_DIRECTION_LTR); 
+2

私はもっと良い解決策を見たいと思っていますが、今はこれが唯一の方法です。 – miho

+2

私のために 'bottomSheet.requestLayout()'はビューを変更した後で十分でした – Odys

+1

私の前のコメントを取り戻して、インスタント・ランは私と騙していました – Odys

0

。 @ sositeが彼のコメントで述べたように、問題は記録されており、最新のリリースで修正されています。 Issue log here

デザインサポートライブラリをバージョン24.0.0に更新して確認してください。

0

>サポートライブラリで> 24.0.0の問題が解決しましたが、なんらかの理由で古いバージョンを使用する必要がある場合は、回避策があります。

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

私は同じ問題に直面しました。その内容に基づいてピーク高さを更新しようとすると、以前のレイアウトからの高さが見つかりました。新しいレイアウトがまだ行われていないので、これは理にかなっています。 UIスレッドにポストすることにより、新しいレイアウトの後にレイアウト高さが計算され、もう1つのレイアウト要求が行われて、ボトムシートを正しい高さに更新する。

void show() { 
    setVisibility(View.VISIBLE); 
    post(new Runnable() { 
     @Override 
     public void run() { 
      mBottomSheetBehavior.setPeekHeight(findViewById(R.id.sheetPeek).getHeight()); 
      requestLayout(); 
     } 
    }) 
} 
関連する問題