- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
这将是一个棘手的问题,但不是对你们而是对我而言。
解释我想要什么会很困难,所以请耐心等待。
我正在使用 AdvancedRecyclerView 库,特别是 Draggable 和 Swipping 库
这是我为列表中的每个项目使用的布局:
<?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>
这个Layout文件中最重要的是id为container的FrameLayout和id为turnOn的SwitchButton .
在container 和SwitchButton 中有一个ClickListener。第一个触发另一个 Fragment,第二个触发 Switch。
问题是,如果 SwitchButton 因单击或滑动而被禁用,则单击操作会转到 容器,这不是我想要的。我尝试了代码中的所有内容,但我认为我的问题出在布局文件中...
例如:如果 SwitchButton 被阻止点击或滑动,用户不应该用那个按钮做任何事情,而是当用户点击被阻止的按钮时发生的事情单击转到容器,将执行不需要的内容。
注意:即使SwitchButton被屏蔽,用户自己也可以选择点击容器,但我不希望>容器在被阻止的按钮中被点击时被触发。
我已尽力解释我的问题,如果你们需要有关我将在此处提供的代码的更多信息。
一如既往的感谢,伊戈尔·莫尔斯。
最佳答案
您的问题来自 SwitchButton
库的实现。
当您将 View.OnClickListener
附加到您的 SwitchButton
并且启用了开关时,一切都会按预期进行,因为点击会转到该点击监听器。但是,当开关被禁用时,点击会转到 SwitchButton
的 onTouchEvent()
实现。这是该方法的第一部分(来自 SwitchButton
source 代码):
@Override
public boolean onTouchEvent(MotionEvent event) {
if (!isEnabled() || !isClickable() || !isFocusable()) {
return false;
}
如果您查看onTouchEvent()
的文档,您会发现:
Returns: True if the event was handled, false otherwise.
因此 SwitchButton 库明确表示它不处理点击,并且这些点击应该在 View 层次结构中向上冒泡。
我看到两个相对简单的解决方案。
首先是创建您自己的 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 中,并为该包装器分配一个 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
}
});
就我个人而言,我更喜欢第一种。
关于Android AdvancedRecyclerView SwitchButton 阻止点击进入父布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45745168/
这将是一个棘手的问题,但不是对你们而是对我而言。 解释我想要什么会很困难,所以请耐心等待。 我正在使用 AdvancedRecyclerView 库,特别是 Draggable 和 Swipping
首先,抱歉我的英语 我想为我的切换按钮添加新的背景,但它不起作用。我在 style.css 中创建了一个新规则,如下所示: .v-switch-slider-gruppe { position
我需要创建自定义 View - TextView 和 Switch 按钮。 我有自定义 View : public class CustomTextWithSwitch extends LinearL
我是一名优秀的程序员,十分优秀!