BottomSheetDialog是一種可以從屏幕底端出現(xiàn),上下滑動即可關(guān)閉或展開的對話框布局,因?yàn)槠鋽U(kuò)展性、易用性強(qiáng),占用布局面積小等優(yōu)勢深受開發(fā)者的喜愛,具體可以參見我之前的文章:《BottomSheetDialog沉浸式的一些坑》( http://www.itdecent.cn/p/08755838c00f )有相關(guān)介紹。
正常情況下在BottomSheetDialog中嵌套滑動布局的不會出現(xiàn)任何問題的,但當(dāng)你嵌套Listview時(shí)就可能出現(xiàn)如下的滑動沖突問題了:
問題復(fù)現(xiàn)
1.前提:當(dāng)BottomSheetDialog完全展開(全屏)的情況下;
2.列表內(nèi)容高度撐起整體布局高度,并大于屏幕高度的情況下;
3.向上滑動列表到列表底部;
4.向下滑動,發(fā)現(xiàn)列表沒動,BottomSheetDialog卻被滑動了,導(dǎo)致此時(shí)容易誤操作關(guān)閉BottomSheetDialog。
解決方案:
1.在列表滑動事件截獲Touch觸摸事件;
2.判斷列表處于頂端時(shí)才取消截獲Touch觸摸事件
完美解決!
代碼中isListAtTopFlag 為列表是否處于頂端的Flag,名為listTask的列表處于頂端時(shí)釋放Touch觸摸事件的方法,讓BottomSheetDialog獲取觸摸事件即可。
相關(guān)代碼如下:
listTask.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (!listTask.canScrollVertically(-1)) { //canScrollVertically(-1)的值表示是否能向下滾動,false表示已經(jīng)滾動到頂部
listTask.requestDisallowInterceptTouchEvent(false);
}else{
listTask.requestDisallowInterceptTouchEvent(true);
}
return false;
}
});
以上。
如果本文對您有所幫助麻煩點(diǎn)個(gè)贊,如有疑問歡迎在評論區(qū)留言交流。