2016-08-15 2 views
1

У меня есть два TextView, и я хочу установить на setOnTouchListener только для TextView. Я нашел this SO answer и сделал это, как указано в этом ответе, но я не мог решить проблему. Я использую GestureDetectorCompat. Я пробовал много решений, но все та же проблема.Регистрация TouchListener на особом взгляде с использованием GestureDetectorCompat

Когда я коснувшись textview1 методом onFling становится вызывается из регистра onTouch слушателя, но когда я касаюсь textview2 метода onFling еще вызывался из его life cycle method. Я не понимаю, почему его вызов onFling на un-register textview. Пожалуйста, помогите мне.

acticity_main.xml

<TextView 
     android:layout_width="match_parent" 
     android:layout_height="100dp" 
     android:background="#ffcc99" 
     android:id="@+id/textview1" 
     android:layout_margin="20dp" 
     android:text="Hello World!" /> 
    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="100dp" 
     android:layout_gravity="bottom" 
     android:background="#ffcc88" 
     android:id="@+id/textview2" 
     android:text="Hello World!" /> 

MainActivity.java

import android.graphics.Path; 
import android.os.Bundle; 
import android.support.v4.view.GestureDetectorCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.view.GestureDetector; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.TextView; 

public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener { 

    private static String DEBUG_TAG = "debug"; 
    private TextView mTextView; 
    private GestureDetectorCompat mGestureDetector; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mGestureDetector = new GestureDetectorCompat(this,this); 
     findViewById(R.id.textview1).setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, final MotionEvent event) { 
       Log.e(DEBUG_TAG, "setOnTouchListener"); 
       mGestureDetector.onTouchEvent(event); 
       return true; 
      } 
     }); 

    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     Log.e(DEBUG_TAG, "onTouchEvent"); 
     mGestureDetector.onTouchEvent(event); 

     return super.onTouchEvent(event); 
    } 


    @Override 
    public boolean onDown(MotionEvent e) { 
     Log.e(DEBUG_TAG, "onDown"); 
     return false; 
    } 

    @Override 
    public void onShowPress(MotionEvent e) { 
     Log.e(DEBUG_TAG, "onShowPress"); 
    } 

    @Override 
    public boolean onSingleTapUp(MotionEvent e) { 
     Log.e(DEBUG_TAG, "onSingleTapUp"); 
     return false; 
    } 

    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 
     Log.e(DEBUG_TAG, "onScroll"); 
     return false; 
    } 

    @Override 
    public void onLongPress(MotionEvent e) { 
     Log.e(DEBUG_TAG, "onLongPress"); 
    } 
@Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     Log.e(DEBUG_TAG, "onFling " + e1.getX() + " - " + e2.getX()); 
} 
} 
+1

Это связано с тем, что вы вызываете 'mGestureDetector.onTouchEvent (event);' inside 'Activity # onTouchEvent()' – pskink

+0

Итак, куда его поместить? –

+0

в 'OnTouchListener # onTouch', как вы уже делаете – pskink

ответ

0

Пожалуйста, удалите onTouchEvent метод вне onCreate, а затем она будет работать только для textview1. Потому что вы применили onTouchEvent вне onCreate она будет называться, когда есть жест событие на всей MainActivity с onTouchEvent вне onCreate также призывает mGestureDetector.onTouchEvent(event)

Заявление

mGestureDetector.onTouchEvent(event); 

автоматически вызывает onTouchEvent из GestureDetectorCompact Звонки, которые действительно делают соответствующие обратные вызовы, предоставленные OnGestureListener на основе события движения.

Смежные вопросы