gpt4 book ai didi

Android:嵌套 Bottom Sheet 点击/拖动触摸事件问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:59:24 27 4
gpt4 key购买 nike

我有一个 Bottom Sheet 嵌套在另一个 Bottom Sheet 中(FrameLayouts 使用 BottomSheet 布局行为)

我还有几个“透视 View ”(FrameLayouts),它们附加了点击监听器,可在点击时分别展开 Bottom Sheet 。

所以应用程序基本上有 3 个主屏幕。 'main container',然后是第一个'bottom sheet',可以全屏展开,然后在第一个bottom sheet的底部,是第二个bottom sheet,也可以展开全屏。

问题:

当我将 RecyclerView 添加到嵌套的 Bottom Sheet “容器” View 时,拖动停止对第二个速览 View (Sheet 2 Peek)起作用。如果我删除 peek View ClickListener RecyclerView,事情似乎工作得很好。

期望的结果:

两个 Bottom Sheet 都应保持可拖动状态,并且应该能够单击 peek View 以展开其父 Bottom Sheet 。 Bottom Sheet 应像往常一样响应嵌套滚动。

我试过删除 ClickListener 并改用触摸手势,但我尝试过的似乎都无济于事。

我正在使用设计支持库的 v25.3.1,我能够在运行 4.4.4 stock 的 Galaxy S4 和运行 7.1.2 的 Nexus 6P 上重现此问题股票。 (我没有任何其他可用的设备)。

我还在 github 上创建了一个测试项目,供有兴趣仔细研究的任何人使用: https://github.com/timusus/bottomsheet-test

下面是展示布局的几个屏幕截图:

1 2 3

布局结构如下所示(为清楚起见省略了一些代码):

<CoordinatorLayout>

<FrameLayout
android:id="@+id/mainContainer"
android:layout_height="match_parent"/>

<FrameLayout
android:id="@+id/sheet1"
android:layout_height="match_parent"
app:layout_behavior="CustomBottomSheetBehavior"
app:behavior_peekHeight="64dp">

<FrameLayout
android:id="@+id/sheet1Container"
android:layout_height="match_parent"/>

<CoordinatorLayout>

<FrameLayout
android:id="@+id/sheet2
android:layout_height="match_parent"
app:layout_behavior="CustomBottomSheetBehavior"
app:behavior_peekHeight="64dp">

<FrameLayout
android:id="@+id/sheet2Container"
android:layout_height="match_parent">

<!-- Problematic RecyclerView -->
<RecyclerView
android:layout_height="match_parent"/>

</FrameLayout>

<!-- Problematic Click Listener on this view -->
<FrameLayout
android:id="@+id/sheet2PeekView"
android:layout_height=64dp"/>

</FrameLayout>

</CoordinatorLayout>

<FrameLayout
android:id="@+id/sheet1PeekView"
android:layout_height=64dp"/>

</FrameLayout>
</CoordinatorLayout/>

CustomBottomSheetBehavior 只是 BottomSheetBehavior 的一个简单子(monad)类,如果第二个工作表展开或拖动,它会阻止第一个工作表拦截触摸事件。这允许将第二张纸从“展开”拖动到“折叠”,而不会同时折叠第一张纸。

public class CustomBottomSheetBehavior<V extends View> extends BottomSheetBehavior<V> {

private boolean allowDragging = true;

public void setAllowDragging(boolean allowDragging) {
this.allowDragging = allowDragging;
}

@Override
public boolean onInterceptTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) {
if (!allowDragging) {
return false;
}

return super.onInterceptTouchEvent(parent, child, event);
}
}

我不认为 BottomSheetBehavior 的自定义与此问题相关,但为了完整起见,下面是它的使用方式:

FrameLayout sheet1 = (FrameLayout) findViewById(R.id.sheet1);
bottomSheetBehavior1 = (CustomBottomSheetBehavior) BottomSheetBehavior.from(sheet1);

FrameLayout sheet2 = (FrameLayout) findViewById(R.id.sheet2);
bottomSheetBehavior2 = (CustomBottomSheetBehavior) BottomSheetBehavior.from(sheet2);
bottomSheetBehavior2.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
//If the second sheet is expanded or dragging, don't allow the first sheet to respond to touch events.
if (newState == BottomSheetBehavior.STATE_EXPANDED || newState == BottomSheetBehavior.STATE_DRAGGING) {
bottomSheetBehavior1.setAllowDragging(false);
} else {
bottomSheetBehavior1.setAllowDragging(true);
}
}

我似乎无法弄清楚这是否与 BottomSheetonInterceptTouchEvent 有关,内部 RecyclerView 的嵌套滚动处理>,View.ClickListener 窃取触摸事件,以上的组合,或者其他的东西。

如有任何帮助,我们将不胜感激。

最佳答案

已修复

I can't seem to figure out if this is to do with theonInterceptTouchEvent of the BottomSheet, nested scroll handling ofthe inner RecyclerView, View.ClickListener stealing touch events, acombination of the above, or something else altogether.

它是上面CustomBottomSheetBehaviorView.ClickListener的组合

问题是 bottomSheetBehavior1getSheet2PeekView 拖动时发生拖动事件,因此检测 getSheet2PeekView 上的触摸事件并设置 bottomSheetBehavior1 拖动 falsebottomSheetBehavior2 true


解决方案

输入这段代码,你的问题就解决了。

findViewById(getSheet2PeekViewResId()).setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.e(TAG, "onTouch: ");
bottomSheetBehavior1.setAllowDragging(false);
bottomSheetBehavior2.setAllowDragging(true);
return false;
}
});

还创建了 Pull Request 到您的 repo 并进行完全有效的更改。

关于Android:嵌套 Bottom Sheet 点击/拖动触摸事件问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43742315/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com