如何禁用所有视图的触摸事件是最佳方法?
如何禁用所有视图的触摸事件是最佳方法?
这里有一个禁用某个视图组的所有子视图的函数:
/**
* 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);
}
}
}
FrameLayout
添加的Fragment
的方法,这个方法非常有效。 - uniruddhsetEnabled()
/isEnabled
- 而许多人都忽略了这一点... - ubuntudroid覆盖 Activity 的 dispatchTouchEvent
方法并按照如下方式:
@Override
public boolean dispatchTouchEvent(MotionEvent ev){
return true;//consume
}
如果您返回true
,所有触摸事件都将被禁用。false
,它们将正常工作。super.dispatchTouchEvent(ev)
。 - Ercan你可以尝试:
your_view.setEnabled(false);
应该使用以下代码禁用触摸事件:
或者你可以尝试以下代码(感谢Ercan):
@Override
public boolean dispatchTouchEvent(MotionEvent ev){
return true;//consume
}
或者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;
}
if
语句以避免不必要的否定。从逻辑上讲是等效的,但可以减少错误的可能性(取反符号“!”很容易被忽略)。 - SMBiggs使用此方法。返回 true 将表示监听器已消耗该事件,Android 无需执行任何操作。
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
最简单的方法是这样做
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)
}
}
可点击
,在这里解释:https://dev59.com/YGoy5IYBdhLWcg3wnPWJ#50299156 - Lance Samariafun 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)
getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
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);
}
}
}