Что означает логическое значение, возвращаемое из метода обработки события в Android
в android большинство методов прослушивателя событий возвращают логическое значение. Что означает это значение true / false ? к чему это приведет в последующих событиях ?
class MyTouchListener implements OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
logView.showEvent(event);
return true;
}
}
относительно приведенного выше примера, если вернуть true в onTouch метод, я обнаружил, что каждое событие касания (вниз, вверх, перемещение и т. д.) было захвачено в соответствии с моим logView. Наоборот,если вернуть false, а события, были захвачены. Так это гостиничную систему, которая вернет значение false предотвратит событие распространяться. Я прав ?
кроме того, в OnGestureListener, многие методы также должны возвращать логическое значение. Имеют ли они одно и то же значение ?
6 ответов:
если вы возвращаете
trueсACTION_DOWNсобытие вас интересуют остальные события в этот жест. А "жест" в данном случае означает все события вплоть до финалаACTION_UPилиACTION_CANCEL. ВозвращениеfalseСACTION_DOWNозначает, что вы не хотите, чтобы событие и другие представления будут иметь возможность обрабатывать его. Если у вас есть перекрывающиеся виды, это может быть одноуровневый вид. Если нет, то он будет пузыриться до родителя.
из документации : http://developer.android.com/reference/android/view/View.OnTouchListener.html#onTouch(android.view.View-андроид.вид.MotionEvent)
"True, если прослушиватель использовал событие, false в противном случае."
Если вы возвращаете true, событие обрабатывается. Если false, он перейдет на следующий слой вниз.
логическое значение, которое определяет, является ли событие потребляется или нет.
Да, вы правы. Если вы возвращаете false, следующий прослушиватель обрабатывает событие. Если он возвращает true, событие потребляется вашим слушателем и не отправляется в следующий метод.
Я потерял почти один день в устранении неполадок, но все же я узнал, что моя функция onTouch вызывается 2 раза при использовании true и 1 раз при использовании false.
все выше ответ правильный, но результат отличается, если вид
clickableилиclickableпример, у меня есть
LinearLayoutсодержится 1Buttonи 1TextViewтакой<LinearLayout android:id="@+id/linearlayout_root" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#0aa" android:orientation="vertical"> <Button android:id="@+id/button_click" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="40dp" android:text="Button Click" android:textSize="20sp" /> <TextView android:id="@+id/textview_click" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="40dp" android:text="TextView Click" android:textSize="20sp" android:background="#e4e4e4" /> </LinearLayout>в деятельности, у меня есть код, как
class MainActivity : AppCompatActivity() { val TAG = "TAG" @SuppressLint("ClickableViewAccessibility") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) findViewById<LinearLayout>(R.id.linearlayout_root).setOnTouchListener { v, event -> Log.i(TAG, "LinearLayout onTouch event " + getDisplayAction(event.action)) false } findViewById<Button>(R.id.button_click).setOnTouchListener { v, event -> Log.i(TAG, "Button onTouch event " + getDisplayAction(event.action)) false } findViewById<TextView>(R.id.textview_click).setOnTouchListener { v, event -> Log.i(TAG, "TextView onTouch event " + getDisplayAction(event.action)) false } } private fun getDisplayAction(action: Int): String { return when (action) { MotionEvent.ACTION_DOWN -> "DOWN" MotionEvent.ACTION_MOVE -> "MOVE" MotionEvent.ACTION_UP -> "UP" MotionEvent.ACTION_CANCEL -> "CANCEL" MotionEvent.ACTION_OUTSIDE -> "OUTSIDE" else -> "UNKNOWN" } } }корпус 1
Linear onTouch return **FALSE**,Button onTouch return **FALSE**,TextView onTouch return **FALSE**нажать на кнопку
I/TAG: Button onTouch eventDOWN I/TAG: Button onTouch eventMOVE I/TAG: Button onTouch eventUPнажмите на TextView
TAG: TextView onTouch eventDOWN TAG: LinearLayout onTouch eventDOWNнажмите на LinearLayout
TAG: LinearLayout onTouch eventDOWNкорпус 2
Linear onTouch return **FALSE**,Button onTouch return **TRUE**,TextView onTouch return **TRUE**нажать на кнопку
Similar to case 1нажмите на TextView
TAG: TextView onTouch event DOWN TAG: TextView onTouch event MOVE TAG: TextView onTouch event UPнажмите на LinearLayout
Similar to case 1корпус 3
Linear onTouch return **TRUE**,Button onTouch return **FALSE**,TextView onTouch return **FALSE**нажмите на Кнопка
Similar to case 1нажмите на TextView
TAG: TextView onTouch event DOWN TAG: LinearLayout onTouch event DOWN TAG: LinearLayout onTouch event MOVE TAG: LinearLayout onTouch event UPнажмите на LinearLayout
TAG: LinearLayout onTouch event DOWN TAG: LinearLayout onTouch event MOVE TAG: LinearLayout onTouch event UPПримечание
- по умолчанию
TextViewиnot clickable, он станет кликабельным, если мы установимandroid:clickable="true"в xml или когда мы ставимtextView.setOnClickListener(...)- при отладке,
event MOVEможет вызвать больше, чем мой журнал (он основан на том, как вы коснитесь)резюме
onTouchвозвращениеtrueили представленияclickable, Вид получит всеonTouchEventonTouchвозвращениеfalseи неclickable, вид не получить следующий onTouchEvent (это родитель может получить его)надеюсь, что это поможет
DEMO
с Android-документ:
Примечание: Android сначала вызовет обработчики событий, а затем соответствующие обработчики по умолчанию из определения класса во-вторых. Таким образом, возврат true из этих прослушивателей событий остановит распространение события на другие прослушиватели событий, а также заблокирует обратный вызов обработчика событий по умолчанию в представлении. Поэтому убедитесь, что вы хотите завершить событие, когда вы возвращаете true.