2016-10-17 6 views
0

Я пытаюсь оборачивать голову тем, как Android обрабатывает события касания, и я запутался в этом. Из того, что я знаю, если для события onTouch() элемента вида установлено значение true, это означает, что элемент готов обрабатывать это событие касания, то есть он потребляет событие касания.
Если это так, в приведенном ниже фрагменте кода после запуска блокировка, когда она вернулась, не позволила нам изменить выбор радиогруппы
Я уверен, что это потому, что я не слишком хорошо знаком с как работают события для Android. Может кто-нибудь, пожалуйста, подытожим это правильно для меня. И объясните, почему возвращение true для onTouch() событий помешало нам выбрать новый элемент.Android - Что происходит, когда для метода ontouch() для переключателя установлено значение true

package com.examples.customtouch; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.CheckBox; 

/** 
* Created by Dave Smith 
* Double Encore, Inc. 
* Date: 9/25/12 
* TouchListenerActivity 
*/ 

public class TouchListenerActivity extends Activity implements View.OnTouchListener { 

    /* Views to display last seen touch event */ 
    CheckBox mLockBox; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.touch_listener); 

     mLockBox = (CheckBox) findViewById(R.id.checkbox_lock); 

     findViewById(R.id.selection_first).setOnTouchListener(this); 
     findViewById(R.id.selection_second).setOnTouchListener(this); 
     findViewById(R.id.selection_third).setOnTouchListener(this); 
    } 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     /* 
     * Consume the events here so the buttons cannot process them 
     * if the CheckBox in the UI is checked 
     */ 
     return mLockBox.isChecked(); 
    } 

    private String getNameForEvent(MotionEvent event) { 
     String action = ""; 
     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       action = "ACTION_DOWN"; 
       break; 
      case MotionEvent.ACTION_CANCEL: 
       action = "ACTION_CANCEL"; 
       break; 
      case MotionEvent.ACTION_MOVE: 
       action = "ACTION_MOVE"; 
       break; 
      case MotionEvent.ACTION_UP: 
       action = "ACTION_UP"; 
       break; 
      default: 
       return null; 
     } 

     return String.format("%s\n%.1f, %.1f", action, event.getX(), event.getY()); 
    } 
} 

своей деятельности в XML-файл

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:padding="10dp"> 

    <CheckBox 
     android:id="@+id/checkbox_lock" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Lock Selection" /> 

    <RadioGroup 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal"> 
     <RadioButton 
      android:id="@+id/selection_first" 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:text="First"/> 
     <RadioButton 
      android:id="@+id/selection_second" 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:text="Second"/> 
     <RadioButton 
      android:id="@+id/selection_third" 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:text="Third"/> 
    </RadioGroup> 
</LinearLayout> 

Пожалуйста, обратите внимание, что этот фрагмент кода из проекта по Dave Smith под названием Custom Touch Examples

ответ

1

Из документации на https://developer.android.com/reference/android/view/View.OnTouchListener.html, возвращающегося true из onTouch указывает, что event был поглощен. Хотя я не уверен на 100%, мой забор заключается в том, что он не должен распространяться на другие элементы в иерархии, и поэтому событие не будет передано трем RadioButton с в макете, что означает, что они не будут получать уведомления о любых касаниях.

Метод onTouch служит для двух целей, позволяющих выполнять пользовательскую логику этого события и указывать, передавать ли событие другим обработчикам через возвращаемое значение.