Метод onTouchEvent не называется

У меня проблема, что мой метод

@Override public boolean onTouchEvent(MotionEvent event) { return gestureDetector.onTouchEvent(event); } 

Называется более новым. Любые идеи, почему это так? Я создаю приложение api 4.0.3 google, и я пытаюсь включить swipes для моего viewFliper. Однако он не может работать, если на сенсорном носителе называется более новый.

кстати:

  public class MainActivity extends SherlockMapActivity implements ActionBar.TabListener { 

Это декларация моей деятельности. И для обнаружения swipes я реализовал это:

  SimpleOnGestureListener simpleOnGestureListener = new SimpleOnGestureListener(){ @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) { float sensitvity = 50; if((e1.getX() - e2.getX()) > sensitvity){ SwipeLeft(); }else if((e2.getX() - e1.getX()) > sensitvity){ SwipeRight(); } return true; } }; GestureDetector gestureDetector= new GestureDetector(simpleOnGestureListener); 

Спасибо!

редактировать:

main.xml:

  <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/main_view" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" > <ViewFlipper android:id="@+id/ViewFlipper" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#ffffff" > <include android:layout_height="match_parent" layout="@layout/mymain" /> <include layout="@layout/secondmain" /> <include layout="@layout/thirdmain" /> <include layout="@layout/fourthmain" /> </ViewFlipper> </LinearLayout> 

Edit2: все мои включенные макеты имеют выполненный scrollview, возможно, что прокрутка принимает эти события и обрабатывает их. И как определить жесты, если так?

Solutions Collecting From Web of "Метод onTouchEvent не называется"

Ну, я нахожу идеальное решение. Я реализовал новый метод:

  @Override public boolean dispatchTouchEvent(MotionEvent event) { View v = getCurrentFocus(); boolean ret = super.dispatchTouchEvent(event); 

И теперь все работает отлично!

Спасибо всем за то, что помогли мне добраться досюда …

Редактировать:

Мой последний код:

 @Override public boolean dispatchTouchEvent(MotionEvent event) { View v = getCurrentFocus(); if (v instanceof EditText) { View w = getCurrentFocus(); int scrcoords[] = new int[2]; w.getLocationOnScreen(scrcoords); float x = event.getRawX() + w.getLeft() - scrcoords[0]; float y = event.getRawY() + w.getTop() - scrcoords[1]; if (event.getAction() == MotionEvent.ACTION_UP && (x < w.getLeft() || x >= w.getRight() || y < w.getTop() || y > w .getBottom())) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(getWindow().getCurrentFocus() .getWindowToken(), 0); } } boolean ret = super.dispatchTouchEvent(event); return ret; } 

Хорошо, теперь я уверен, что проблема в том, что ручка scrollview касается, так что в любом случае игнорировать это и все же быть прокруткой avaiable?

Да, в этом проблема, когда андроид обрабатывает события касания, каждое событие переходит от дочернего к родительскому, поэтому сначала оно обрабатывается ViewFlipper, но затем оно переходит в ScrollView. Таким образом, вы должны реализовать getParent (). RequestDisallowInterceptTouchEvent (true) (см. Класс ViewParent ), чтобы сделать все события касания обработанные ViewFlipper, а затем просто определить направление жестов, если горизонтальное, а затем флип-представление, если нет, то передать сенсорное событие в ScrollView Или просто прокручивать ScrollView программно

EDIT: Также вы можете реализовать OnTouchListener в вашем ViewFlipper и в этом триггере слушателя GestureDetector.onTouchEvent (event), но для этого также требуется, чтобы requestDisallowInterceptTouchEvent вашего родительского представления был установлен в true

Как я писал в комментариях Габриджана о том, что это постоянно срабатывает при касании экрана, на самом деле есть простой способ получить только события касания:

 @Override public boolean dispatchTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { System.out.println("TOUCH DOWN!"); //set immersive mode here, or whatever... } return super.dispatchTouchEvent(event); } 

Для меня было очень полезно включить Android в режим погружения, когда какая-либо часть экрана была затронута независимо от того, какой элемент. Но я не хотел повторно устанавливать режим погружения!

Все жесты и события касания идут в иерархию наименьшего элемента, которая может ее обрабатывать. Поэтому, если у вас есть слушатель в включенном макете, вы можете вызвать ((TypeOfParrent)yourView.getParent()).onTouchEvent(event) чтобы делегировать событие обработчику, который вы хотите.

ADD: Я рекомендую вам использовать ViewPager для перелистывания просмотров. В ViewPager вам не нужно реализовывать свой собственный onGestureListener.

http://www.edumobile.org/android/android-beginner-tutorials/view-pager-example-in-android-development/

http://developer.android.com/reference/android/support/v4/view/ViewPager.html