Каким образом можно отключить сенсорные события для всех просмотров?
Большое спасибо,
Gratzi
Каким образом можно отключить сенсорные события для всех просмотров?
Большое спасибо,
Gratzi
Вот функция отключения всех дочерних представлений для некоторой группы просмотров:
/**
* 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
, чтобы они нормально работали
Вы можете попробовать:
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;
}
Используйте это. return true указывает, что слушатель потребляет событие, и андроиду ничего не нужно делать.
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
Как покрыть прозрачный вид на все ваши взгляды и захватить все события касания?
Это может быть невозможно для всего приложения. Вам необходимо переопределить onTouchEvent() для каждого представления и игнорировать пользовательские входы.
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);
}
}
}
За ваш комментарий:
Я просто хочу, чтобы в какой-то момент можно было отключить представления текущей активности
вам кажется, что вы хотите отключить все касание для текущей активности, независимо от того, какое изображение коснулось.
Возврат true
из переопределения Activity.dispatchTouchEvent(MotionEvent)
в соответствующие моменты времени будет потреблять прикосновение и эффективно выполнить это. Этот метод является первым в цепочке вызовов сенсорного метода.
Еще один более простой способ - отключить его через файл макета (например .xml): Просто добавьте
android:shouldDisableView="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)
}