Метод onTouchEvent не называется
У меня возникла проблема с тем, что мой метод
@Override
public boolean onTouchEvent(MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
называется более новым. Есть идеи, почему так? Я создаю приложение google api 4.0.3, и я trzing, чтобы включить swipes для моего viewFliper. Однако он не может работать, если на сенсорном носителе называется более новое.
btw:
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);
Спасибо u!
изменить:
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, возможно, что прокрутка принимает эти события и обрабатывает их. И как определить жесты, если так?
Ответы
Ответ 1
Я нашел идеальное решение. Я внедрил новый метод:
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
View v = getCurrentFocus();
boolean ret = super.dispatchTouchEvent(event);
и теперь все работает отлично!
Edit:
Мой последний код:
@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;
}
Ответ 2
ok, теперь я уверен, что проблема в том, что дескриптор scrollview касается, так что в любом случае игнорировать это и все же быть прокруткой avaiable?
Да, проблема, когда android обрабатывает события касания, каждое событие переходит от дочернего к родительскому, поэтому сначала обрабатывается ViewFlipper, но затем оно переходит в ScrollView. Таким образом, вы должны реализовать getParent(). RequestDisallowInterceptTouchEvent (true) (см. класс ViewParent), чтобы сделать все события касания обработанные ViewFlipper, а затем просто определите направление жестов, если горизонтальный, а затем флип-представление, если нет, то передайте событие касания в ScrollView или просто прокрутите ScrollView программно
EDIT: вы также можете реализовать OnTouchListener в своем ViewFlipper и в этом триггере слушателя GestureDetector.onTouchEvent(event), но для этого также требуется, чтобы requestDisallowInterceptTouchEvent вашего родительского представления был установлен в true
Ответ 3
Как я писал в комментариях Gabrjan, это постоянно срабатывает при касании экрана, на самом деле есть простой способ получить только события касания:
@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 в погруженный режим, когда какая-либо часть экрана была затронута независимо от того, какой элемент. Но я не хотел повторно устанавливать режим погружения!
Ответ 4
Все жесты и события касания идут к иерархии наименьшего элемента в представлении, которая может ее обработать.
Поэтому, если у вас есть слушатель в включенном макете, вы можете вызвать ((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