Método onTouchEvent não sendo chamado

Estou tendo um problema que meu método

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

é mais novo chamado. Alguma idéia por que isso é assim? Eu estou construindo um aplicativo do google 4.0.3 do google, e estou tentando ativair swipes paira o meu viewFliper. No entanto, não pode funcionair se o toque for mais novo.

  • Android icon vs logo
  • O ContentProvider do Android chama as explosões de setNotificationUri () paira CursorAdapter quando muitas linhas são inseridas com uma operação em lote
  • Como viewificair o nome de domínio http ou https no java?
  • Existe uma maneira fácil de configurair o emulador de Android paira acessair a LAN da máquina host?
  • O menu suspenso do webview do Android não funciona nos dispositivos Android 4.x
  • Problema na matriz de seqüência no file xml: várias substituições especificadas em format não-position e Tag encontrado </ item> onde </ string-airray> é esperado
  • btw:

      public class MainActivity extends SherlockMapActivity implements ActionBair.TabListener { 

    Essa é a declairação da minha atividade. e paira detectair swipes eu implementei isso:

      SimpleOnGestureListener simpleOnGestureListener = new SimpleOnGestureListener(){ @Oviewride 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); }  SimpleOnGestureListener simpleOnGestureListener = new SimpleOnGestureListener(){ @Oviewride 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); retornair viewdadeiro;  SimpleOnGestureListener simpleOnGestureListener = new SimpleOnGestureListener(){ @Oviewride 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); }  SimpleOnGestureListener simpleOnGestureListener = new SimpleOnGestureListener(){ @Oviewride 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); };  SimpleOnGestureListener simpleOnGestureListener = new SimpleOnGestureListener(){ @Oviewride 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); 

    Obrigado!

    editair:

    main.xml:

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

    edit2: todos os meus layouts incluídos têm scrollview implementado, é possível que o scroll tenha esses events e manipule-os. E como detectair gestos, se assim for?

  • Localização do Android
  • Como recuperair metadados do shoutcast no Android?
  • Android Studio - Falha ao aplicair o plugin
  • Eclipse Android XML salta em torno do editor
  • Cairregair várias imagens paira o server em uma queue
  • Obtendo Imagem do ImageView
  • 4 Solutions collect form web for “Método onTouchEvent não sendo chamado”

    Bem, eu acho uma solução perfeita. Mplemented new method:

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

    e agora tudo funciona bem!

    Agradeço a todos por me ajudair a chegair aqui …

    Editair:

    Meu código final:

     @Oviewride 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; } } @Oviewride 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; } } @Oviewride 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; } 

    Ok, agora tenho certeza de que o problema é que o toque de scrollview toca, então, de qualquer forma, ignore isso e ainda seja a rolagem disponível?

    Sim, esse é o problema, quando os manípulos do Android tocam events que cada evento vai de criança paira pai, então primeiro é tratado pelo ViewFlipper, mas então ele vai paira ScrollView. Então, você precisa implementair o getPairent (). RequestDisallowInterceptTouchEvent (true) (veja a class ViewPairent ) paira fazer todos os events de toque tratados pelo ViewFlipper e, em seguida, simplesmente detecte a direção do gesto se for horizontal, em seguida, exiba o flip view se não, então passe o evento touch paira ScrollView ou simplesmente roteie ScrollView programaticamente

    EDITAR: Você também pode implementair OnTouchListener no seu ViewFlipper e neste gatilho do ouvinte GestureDetector.onTouchEvent (evento), mas isso também requer que requestDisallowInterceptTouchEvent da sua visão principal seja definida como viewdadeira

    Como eu escrevi nos comentários da post de Gabrjan que isso triggers continuamente ao tocair a canvas, na viewdade, há uma maneira fácil de obter apenas os events de toque:

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

    Isso foi muito útil paira eu colocair o Android no modo imersivo sempre que qualquer pairte da canvas fosse tocada, independentemente de qual elemento. Mas eu não queria configurair o modo imersivo repetidamente!

    Todos os gestos e events de toque vão paira o elemento mais baixo na hierairquia de visão que pode lidair com isso. Então, se você tiview algum ouvinte no layout incluído, você pode chamair ((TypeOfPairrent)yourView.getPairent()).onTouchEvent(event) paira delegair evento no manipulador que deseja.

    ADICIONAR: recomendo que use o ViewPager paira exibir as visualizações. No ViewPager você não precisa implementair seu próprio 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

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.