这将是一个棘手的问题,但不是对你们,而是对我。
解释我想要什么会很难,所以请容忍我。
我使用的是AdvancedRecyclerView库,特别是可拖动和滑动的库
下面是我为列表中的每个项目使用的布局:

<?xml version="1.0" encoding="utf-8"?>
<!--
       Copyright (C) 2015 Haruki Hasegawa

       Licensed under the Apache License, Version 2.0 (the "License");
       you may not use this file except in compliance with the License.
       You may obtain a copy of the License at

           http://www.apache.org/licenses/LICENSE-2.0

       Unless required by applicable law or agreed to in writing, software
       distributed under the License is distributed on an "AS IS" BASIS,
       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
       See the License for the specific language governing permissions and
       limitations under the License.
-->
<!-- NOTE: should use FrameLayout or RelativeLayout for parent of the "@id/container" view (for Android 2.3 compatibility) -->
<FrameLayout xmlns:app="http://schemas.android.com/apk/res-auto"
    style="@style/commonListItemStyle"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="96dp"
    android:layout_margin="4dp"
    android:background="@drawable/bg_swipe_item_neutral">

    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true"
        android:foreground="?attr/selectableItemBackground"
        tools:ignore="UselessParent">

        <LinearLayout
            android:id="@+id/linearLayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <View
                android:id="@+id/statusBar"
                android:layout_width="match_parent"
                android:layout_height="5dp"
                android:layout_gravity="top|left"
                android:background="#20000000"
                android:visibility="gone" />

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:divider="@drawable/list_divider_v"
                android:orientation="horizontal">

                <View
                    android:id="@+id/drag_handle"
                    android:layout_width="15dp"
                    android:layout_height="match_parent"
                    android:layout_gravity="top|left"
                    android:background="@color/material_grey300"
                    android:visibility="visible" />

                <LinearLayout
                    android:layout_width="244dp"
                    android:layout_height="match_parent"
                    android:divider="@drawable/list_divider_v"
                    android:dividerPadding="4dp"
                    android:orientation="vertical"
                    android:showDividers="middle"
                    android:weightSum="3">

                    <TextView
                        android:id="@+id/deviceName"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:layout_weight="2"
                        android:gravity="center_vertical|center_horizontal"
                        android:text="deviceName" />

                    <TextView
                        android:id="@+id/deviceDescription"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:layout_weight="1"
                        android:gravity="center_vertical|center_horizontal"
                        android:text="deviceDescription" />

                </LinearLayout>

                <com.kyleduo.switchbutton.SwitchButton
                    android:id="@+id/turnOn"
                    style="@style/SwitchButtonStyle"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    app:kswBackMeasureRatio="2.2"
                    app:kswBackRadius="2dp"
                    app:kswTextOff="Off"
                    app:kswTextOn="On"
                    app:kswThumbRadius="2dp" />

            </LinearLayout>
        </LinearLayout>

    </FrameLayout>

</FrameLayout>

在这个布局文件中,最重要的是id容器的framelayout和id打开的末尾的switchbutton。
容器和switchbutton中有一个clicklistener。第一个触发另一个片段,第二个触发开关。
问题是,如果switchbutton被禁用了点击或滑动,那么点击操作就会转到容器,这不是我想要的。我尝试了所有的代码,但我认为我的问题是在布局文件…
例如:如果switchbutton被阻止单击或滑动,则用户不应该对该按钮执行任何操作,而是当用户单击被阻止的按钮时,单击将转到容器,而不需要的操作将执行。
注意:即使switchbutton被阻塞,用户自己也可以选择单击容器,但我不希望在单击阻塞按钮时触发容器。
我尽力解释我的问题,如果你们要求更多关于我将在这里提供的代码的信息。
一如既往地谢谢你,
伊戈尔·莫尔斯。

最佳答案

问题
您的问题来自于SwitchButton库的实现。
当您的View.OnClickListener连接到SwitchButton并且开关已启用时,所有操作都按预期工作,因为轻触会转到该单击侦听器。然而,当开关被禁用时,抽头转到SwitchButtononTouchEvent()实现。下面是该方法的第一部分(来自SwitchButton source代码):

@Override
public boolean onTouchEvent(MotionEvent event) {

    if (!isEnabled() || !isClickable() || !isFocusable()) {
        return false;
    }

如果您查看onTouchEvent()的文档,您将发现:
返回:
如果处理了事件,则为true;否则为false。
所以switchbutton库明确表示它不处理taps,这些taps应该会在视图层次结构中冒泡。
解决方案
我看到两个相对简单的解决方案。
第一种方法是创建自己的自定义子类SwitchButton,并将onTouchEvent()更改为使用单击(即使在禁用时):
public class MySwitchButton extends SwitchButton {

    public MySwitchButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return !isEnabled() || super.onTouchEvent(event);
    }
}

第二种方法是在另一个视图中包装SwitchButton,并为此包装分配View.OnClickListener,以拦截单击事件:
<FrameLayout
    android:id="@+id/interceptor"
    ...>

    <com.kyleduo.switchbutton.SwitchButton
        .../>

</FrameLayout>

在Java中:
findViewById(R.id.interceptor).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // do nothing
    }
});

就我个人而言,我更喜欢第一个。

08-04 04:01