最初に
この記事に書いてあることは23.2.1で修正されました。よって、普通に使って問題ありません。やったね!!
(23.2.1での直し方も、この記事で紹介しているのとほぼ同様でした)
Design Support Library 23.2.0がリリースされた
BottomSheetDialogというのでBottomSheetがカジュアルに使えるようになりましたが、ユーザーがダイアログを引っ張り上げすぎると勝手にDialogがcancelされてしまうというあんまり好きじゃない挙動があります。
これが公式なのか意図しない挙動なのかはわかりませんが、現時点ではどうにも直す手段が提供されていないように見えるので、ソースコードを引っ張ってきてちょっとイジりました。
問題箇所
onTouch()でキャンセルしている判定で、ACTION_UP時に指がBottomSheetのコンテンツ部分からはみ出している場合に強制キャンセルされてしまいます。ユーザーが勢い良く引っ張りあげると、大抵の場合コンテンツ部分から指がはみ出ますが、その時に強制的にcancel()が走るのでちょっと困ります。
coordinator.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (isShowing() &&
MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_UP &&
!coordinator.isPointInChildBounds(finalView,
(int) event.getX(), (int) event.getY())) {
cancel();
return true;
}
return false;
}
});;
イジッた結果
ユーザーが引っ張り上げすぎても勝手にキャンセルされない、空白領域(ちょっと暗くなってる半透過部分)をタップした場合のみキャンセルされる、という風になっています。
公式が治った時にライブラリそのものを消せるように、基本的な挙動やクラス名はイジッてません。
コレを導入する場合
ライブラリを追加して、使用するクラス名を下記に変更してください。
- 変更前
- android.support.design.widget.BottomSheetDialog
- 変更後
- com.eaglesakura.android.design.BottomSheetDialog
repositories {
maven { url "http://eaglesakura.github.io/maven/" } // add maven repo
mavenCentral()
}
dependencies {
compile 'com.eaglesakura:android-support-bottomsheet:1.0.+' // add library
}
最後に
普通に挙動変更する手段があったらコメントに書いていただけるとありがたいです。