这将是一个棘手的问题,但不是对你们,而是对我。
解释我想要什么会很难,所以请容忍我。
我使用的是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
并且开关已启用时,所有操作都按预期工作,因为轻触会转到该单击侦听器。然而,当开关被禁用时,抽头转到SwitchButton
的onTouchEvent()
实现。下面是该方法的第一部分(来自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
}
});
就我个人而言,我更喜欢第一个。