Подтвердить что ты не робот

Метод 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, возможно, что прокрутка принимает эти события и обрабатывает их. И как определить жесты, если так?

4b9b3361

Ответ 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