Android 禁用所有视图的触摸事件
禁用所有视图的触摸事件的最佳方法是什么?对于整个应用程序可能不可能。您必须为每个视图重写onTouchEvent(),并忽略用户输入。您可以尝试:Android 禁用所有视图的触摸事件,android,android-view,touch-event,Android,Android View,Touch Event,禁用所有视图的触摸事件的最佳方法是什么?对于整个应用程序可能不可能。您必须为每个视图重写onTouchEvent(),并忽略用户输入。您可以尝试: your_view.setEnabled(false); 这将禁用触摸事件 或者,您可以尝试(感谢Ercan): 或 以下是用于禁用某个视图组的所有子视图的函数: /** * Enables/Disables all child views in a view group. * * @param viewGroup the v
your_view.setEnabled(false);
这将禁用触摸事件
或者,您可以尝试(感谢Ercan):
或
以下是用于禁用某个视图组的所有子视图的函数:
/**
* Enables/Disables all child views in a view group.
*
* @param viewGroup the view group
* @param enabled <code>true</code> to enable, <code>false</code> to disable
* the views.
*/
public static void enableDisableViewGroup(ViewGroup viewGroup, boolean enabled) {
int childCount = viewGroup.getChildCount();
for (int i = 0; i < childCount; i++) {
View view = viewGroup.getChildAt(i);
view.setEnabled(enabled);
if (view instanceof ViewGroup) {
enableDisableViewGroup((ViewGroup) view, enabled);
}
}
}
覆盖所有视图的透明视图并捕获所有触摸事件怎么样?覆盖活动的
dispatchTouchEvent
方法,如下所示:
@Override
public boolean dispatchTouchEvent(MotionEvent ev){
return true;//consume
}
如果返回true
所有触摸事件都将被禁用
Return
false
让它们正常工作我制作了这个方法,它非常适合我。它禁用选定视图的所有触摸事件
public static void disableView(View v) {
v.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
if (v instanceof ViewGroup) {
ViewGroup vg = (ViewGroup) v;
for (int i = 0; i < vg.getChildCount(); i++) {
View child = vg.getChildAt(i);
disableView(child);
}
}
}
公共静态无效禁用视图(视图v){
v、 setOnTouchListener(新视图。OnTouchListener(){
@凌驾
公共布尔onTouch(视图v,运动事件){
返回true;
}
});
if(视图组的v实例){
视图组vg=(视图组)v;
对于(int i=0;i
根据您的评论:
我只想在某个时候禁用当前活动的视图
您似乎希望禁用当前活动的所有触摸,而不考虑触摸的视图
在适当的时间从覆盖
活动返回true
。dispatchTouchEvent(MotionEvent)
将使用触摸并有效地完成此操作。此方法是触摸方法调用链中的第一个方法。更简单的方法是通过布局(即.xml)文件禁用它:
加上
android:shouldDisableView="True"
对于要禁用触摸事件的视图。如果且仅当
inProgress
变量设置为false
时,此代码段基本上将此事件传播到父视图,允许触摸事件
private boolean inProgress = false;
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (!inProgress)
return super.dispatchTouchEvent(ev);
return true;
}
用这个。返回true表示侦听器已使用该事件,android无需执行任何操作
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
在科特林:
fun View.setEnabledRecursively(enabled: Boolean) {
isEnabled = enabled
if (this is ViewGroup)
(0 until childCount).map(::getChildAt).forEach { it.setEnabledRecursively(enabled) }
}
// usage
import setEnabledRecursively
myView.setEnabledRecursively(false)
最简单的方法是
private fun enableDisableActivty(isEnable : Boolean){
if(!isEnable) window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
else window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
}
这对我很有效,我创建了一个空方法,并将其称为
doNothing
public void doNothing(View view)
{
}
然后从onClick
event对我想要禁用触摸事件的所有对象调用此方法<代码>android:onClick=“doNothing”
触发单击或触摸事件时,不会处理任何内容。对不起,此更改的目标是什么?您可以创建一个递归过程来更改每个viewsetEnabled(false)的onTouchEvent();在根目录布局上,您希望用户仅使用按钮吗?在android设备上?;)@T0X1C:这正是我想要的。但是它不起作用。@yosh:我不想永远禁用它们。我只是希望能够在某个时候禁用当前活动的视图。如果ListView是“your_view”-ViewGroups的子级,则这对ListView元素不起作用。这不会为子级禁用触摸views@peceps不幸的是,它不适用于片段。例如,如果
ViewGroup
有一个子片段,在FragmentTransaction
中添加的片段及其子对象不会被禁用。@AlexAndro:我仍然使用了通过FrameLayout
添加的片段的方法,效果非常好。此解决方案假定视图组中的所有视图都是视图组的直接子对象。然而,通常情况并非如此。我现在也在考虑这一点,但从孩子的角度来涵盖一切不是很困难吗?它不会被限制为其直接父级的大小吗?欢迎使用堆栈溢出!我编辑了你的答案;通过将代码缩进4个空格,将其放入代码标记中
。一般来说,在这里发布答案时,除了代码之外,最好提供一些解释。虽然此代码片段可能解决问题,但确实有助于提高您的帖子质量。请记住,您将在将来为读者回答这个问题,而这些人可能不知道您的代码建议的原因。我将颠倒if
语句,以避免不必要的负面影响。逻辑上是等效的,但减少了出错的可能性(not符号“!”很容易漏掉)。如果您有像我这样的奇怪用例需要,这个答案将允许您在启用视图的同时禁用触摸事件。在使用拖放的情况下很有用(我的案例)。谢谢在视图上工作。不在视图组上。视图组中的子视图仍然能够接收单击事件。我的活动保留一个RecyclerView,无论返回的是true还是false,如果我覆盖该方法,所有触摸事件都将被禁用。有吗idea@K.Dexter您可能忘记调用super.dispatchTouchEvent(ev)
fun View.setEnabledRecursively(enabled: Boolean) {
isEnabled = enabled
if (this is ViewGroup)
(0 until childCount).map(::getChildAt).forEach { it.setEnabledRecursively(enabled) }
}
// usage
import setEnabledRecursively
myView.setEnabledRecursively(false)
private fun enableDisableActivty(isEnable : Boolean){
if(!isEnable) window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
else window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
}
public void doNothing(View view)
{
}