Отключить сенсорные события для всех видов
Каким образом можно отключить сенсорные события для всех просмотров?
Большое спасибо,
Gratzi
Ответы
Ответ 1
Вот функция отключения всех дочерних представлений для некоторой группы просмотров:
/**
* 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);
}
}
}
Ответ 2
Переопределите метод dispatchTouchEvent
активности и вот так:
@Override
public boolean dispatchTouchEvent(MotionEvent ev){
return true;//consume
}
Если вы вернетесь true
, все события касания будут отключены.
Верните false
, чтобы они нормально работали
Ответ 3
Вы можете попробовать:
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);
}
Ответ 4
Этот фрагмент кода будет в основном распространять это событие в родительском представлении, позволяя событие касания, если и только если переменная inProgress
установлена на false
.
private boolean inProgress = false;
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (!inProgress)
return super.dispatchTouchEvent(ev);
return true;
}
Ответ 5
Используйте это. return true указывает, что слушатель потребляет событие, и андроиду ничего не нужно делать.
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
Ответ 6
Как покрыть прозрачный вид на все ваши взгляды и захватить все события касания?
Ответ 7
Это может быть невозможно для всего приложения. Вам необходимо переопределить onTouchEvent() для каждого представления и игнорировать пользовательские входы.
Ответ 8
getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
Ответ 9
Я сделал этот метод, который отлично подходит для меня. Он отключает все события касания для выбранного вида.
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);
}
}
}
Ответ 10
За ваш комментарий:
Я просто хочу, чтобы в какой-то момент можно было отключить представления текущей активности
вам кажется, что вы хотите отключить все касание для текущей активности, независимо от того, какое изображение коснулось.
Возврат true
из переопределения Activity.dispatchTouchEvent(MotionEvent)
в соответствующие моменты времени будет потреблять прикосновение и эффективно выполнить это. Этот метод является первым в цепочке вызовов сенсорного метода.
Ответ 11
Еще один более простой способ - отключить его через файл макета (например .xml):
Просто добавьте
android:shouldDisableView="True"
для просмотра, которое вы хотите отключить события касания.
Ответ 12
В Котлине:
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)
Ответ 13
Самый простой способ сделать это -
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)
}