Android AdvancedRecyclerView SwitchButton已阻止点击进入父版面

时间:2017-08-17 21:25:08

标签: android android-layout listview android-fragments

这将是一个棘手的问题,但不适合你们,但对我而言。

解释我想要的东西会很难,所以请耐心等待。

我使用AdvancedRecyclerView库特别是Draggable和Swipping one

以下是我的列表中每个项目使用的布局:

<?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>

此布局文件中最重要的事情是 FrameLayout ,ID为容器 SwitchButton 最后为id turnOn

容器 SwitchButton 中有 ClickListener 。第一个触发另一个Fragment,第二个触发Switch。

问题是,如果SwitchButton因为单击或Swipping而被禁用,则单击操作将转到容器,这不是我想要的。我在代码中尝试了所有内容,但我认为我的问题在布局文件中...

例如:如果 SwitchButton 被阻止点击或滑动用户不应该对该按钮执行任何操作,而是发生的事情是当用户点击阻止按钮点击进入容器,将执行不需要的操作。

注意:即使 SwitchButton 被阻止,用户也可以选择点击容器,但我不希望容器。

我尽力解释我的问题,如果你们要求更多关于我在这里提供的代码的信息。

一如既往地谢谢 伊戈尔莫尔斯。

1 个答案:

答案 0 :(得分:2)

问题

您的问题来自SwitchButton库的实施。

如果View.OnClickListener附加了SwitchButton并且启用了切换功能,那么一切都按预期工作,因为点击会转到该点击侦听器。但是,当禁用此开关时,点按即可转到SwitchButton onTouchEvent()的实施。这是该方法的第一部分(来自SwitchButton source代码):

@Override
public boolean onTouchEvent(MotionEvent event) {

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

如果您查看onTouchEvent()的文档,则会发现:

  

<强>返回:   如果事件被处理则为真,否则为假。

所以SwitchButton库明确地说它处理点击,这些点击应该冒泡视图层次结构。

解决方案

我看到两个相对简单的解决方案。

第一种方法是创建自己的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
    }
});

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