禁用所有视图的触摸事件的最佳方法是什么?
14 回答
这是一个禁用某个视图组的所有子视图的函数:
/**
* 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
所有的触摸事件都被禁用。
返回false
让他们正常工作
You could try:
your_view.setEnabled(false);
Which should disable the touch events.
alternatively you can try (thanks to Ercan):
@Override
public boolean dispatchTouchEvent(MotionEvent ev){
return true;//consume
}
or
public boolean dispatchTouchEvent(MotionEvent ev) {
if(!onInterceptTouchEvent()){
for(View child : children){
if(child.dispatchTouchEvent(ev))
return true;
}
}
return super.dispatchTouchEvent(ev);
}
这段代码基本上会将此事件传播到父视图,当且仅当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;
}
});
覆盖所有视图的透明视图并捕获所有触摸事件怎么样?
getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
在科特林:
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)
我做了这个方法,非常适合我。它禁用选定视图的所有触摸事件。
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);
}
}
}
整个应用程序可能无法实现。您必须为每个视图覆盖 onTouchEvent() 并忽略用户输入。
最简单的方法是
private fun setInteractionDisabled(disabled : Boolean) {
if (disabled) {
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
然后从我想禁用触摸事件的所有对象 的事件中调用此方法。android:onClick="doNothing"
当点击或触摸事件被触发时,没有任何处理。
根据您的评论:
我只是希望能够在某个时候禁用当前活动的视图
无论触摸的视图如何,您似乎都想禁用当前活动的所有触摸。
true
在适当的时间从覆盖返回Activity.dispatchTouchEvent(MotionEvent)
将消耗触摸并有效地完成此操作。此方法是触摸方法调用链中的第一个。
一种更简单的方法是通过布局(即 .xml)文件禁用它:只需添加
android:shouldDisableView="True"
对于要禁用触摸事件的视图。