Что означает логическое значение, возвращаемое из метода обработки события в Android
в android большинство методов прослушивателя событий возвращают логическое значение. Что означает это значение true/false ? к чему это приведет в последующих событиях ?
class MyTouchListener implements OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
logView.showEvent(event);
return true;
}
}
относительно приведенного выше примера, если вернуть true в onTouch метод, я обнаружил, что каждое событие касания (вниз, вверх, движение и т. д.) было захвачено в соответствии с моим logView. Напротив, если return false, только событие DOWN было захвачено. Таким образом, кажется, что return false предотвратит событие распространяться. Я прав ?
кроме того, в OnGestureListener, многие методы также должны возвращать логическое значение. Имеют ли они одинаковое значение ?
6 ответов
если вы возвращаете true
с ACTION_DOWN
событие вас интересуют остальные события в этот жест. А "жест" в данном случае означает все события до самого финала ACTION_UP
или ACTION_CANCEL
. Возвращение false
С ACTION_DOWN
означает, что вы не хотите, чтобы событие и другие представления имели возможность обрабатывать его. Если у вас есть перекрывающиеся представления, это может быть представление sibling. Если нет, он будет пузыриться до родителя.
из документации : 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
содержится 1 Button
и 1 TextView
такой
<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
isnot clickable
, он станет кликабельным, если мы установимandroid:clickable="true"
в xml или когда мы ставимtextView.setOnClickListener(...)
- при отладке,
event MOVE
может вызвать больше, чем мой журнал (он основан на том, как вы tap)
резюме
-
onTouch
возвращениеtrue
или представленияclickable
, View получит всеonTouchEvent
-
onTouch
возвращениеfalse
и неclickable
, вид не получить следующий onTouchEvent (это родитель может получить его)
надеюсь, что это поможет
демо
с Android-документ:
Примечание: Android сначала вызовет обработчики событий, а затем соответствующие обработчики по умолчанию из определения класса. Таким образом, возврат true из этих прослушивателей событий остановит распространение события на другие прослушиватели событий, а также заблокирует обратный вызов обработчика событий по умолчанию в представлении. Поэтому убедитесь, что вы хотите завершить событие, когда вы вернете true.