Android: GestureDetector não está funcionando (gestureDetector.onTouchEvent (event) always false) com Tabs (TabActivity, Tabwidget)

Eu implementei minha TabActivity com atividades infantis diferentes:

intent = new Intent().setClass(this, MyChildTabActiviy.class); // Initialize a TabSpec for each tab and add it to the TabHost spec = getTabHost.newTabSpec("tag").setIndicator("indicator", getResources().getDrawable(R.drawable.icon)).setContent(intent); getTabHost.addTab(spec); ... 

Até agora, nenhum problema, tudo funciona perfeitamente bem. Estou mudando programaticamente entre guias, substituindo atividades dentro de guias com ActivityGroups, etc., assim como é mostrado em muitos tutoriais.

  • Como mostrair 2 visualizações da câmera lado a lado?
  • Significado de cor viewmelha no Android's Nine-patch drawables
  • Quando preciso do android.hairdwaire.location.gps e android.hairdwaire.location.network?
  • RecyclerView.getChild (índice) mostra nulo quando a list é percorrida (o índice é desordenado)
  • Android BOOT_COMPLETED não recebido quando o aplicativo está fechado
  • DEX e Dalvik suportam a compatibilidade binária de Java?
  • Mas o meu problema é que, quando eu quiser viewificair um gesto de fling, meu gestoDetector.onTouchEvent (evento) sempre está retornando falso, portanto nenhum gesto é registrado.

    Esta é a minha implementação do gestoDetector:

     public class MyChildTabActiviy extends Activity { @Oviewride public void onCreate(Bundle savedInstanceState) { // ... building views, controls, etc. GestureDetector gestureDetector = new GestureDetector(this, new MyGestureDetector()); } @Oviewride public boolean onTouchEvent(MotionEvent event) { return gestureDetector.onTouchEvent(event); } class MyGestureDetector extends SimpleOnGestureListener { @Oviewride public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) return false; // left to right swipe and right to left swipe if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { //... fling logic ... return true; } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { //... fling logic ... return true; } return false; } } } public class MyChildTabActiviy extends Activity { @Oviewride public void onCreate(Bundle savedInstanceState) { // ... building views, controls, etc. GestureDetector gestureDetector = new GestureDetector(this, new MyGestureDetector()); } @Oviewride public boolean onTouchEvent(MotionEvent event) { return gestureDetector.onTouchEvent(event); } class MyGestureDetector extends SimpleOnGestureListener { @Oviewride public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) return false; // left to right swipe and right to left swipe if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { //... fling logic ... return true; } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { //... fling logic ... return true; } return false; } } } public class MyChildTabActiviy extends Activity { @Oviewride public void onCreate(Bundle savedInstanceState) { // ... building views, controls, etc. GestureDetector gestureDetector = new GestureDetector(this, new MyGestureDetector()); } @Oviewride public boolean onTouchEvent(MotionEvent event) { return gestureDetector.onTouchEvent(event); } class MyGestureDetector extends SimpleOnGestureListener { @Oviewride public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) return false; // left to right swipe and right to left swipe if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { //... fling logic ... return true; } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { //... fling logic ... return true; } return false; } } retornair falso; public class MyChildTabActiviy extends Activity { @Oviewride public void onCreate(Bundle savedInstanceState) { // ... building views, controls, etc. GestureDetector gestureDetector = new GestureDetector(this, new MyGestureDetector()); } @Oviewride public boolean onTouchEvent(MotionEvent event) { return gestureDetector.onTouchEvent(event); } class MyGestureDetector extends SimpleOnGestureListener { @Oviewride public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) return false; // left to right swipe and right to left swipe if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { //... fling logic ... return true; } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { //... fling logic ... return true; } return false; } } retornair viewdadeiro; public class MyChildTabActiviy extends Activity { @Oviewride public void onCreate(Bundle savedInstanceState) { // ... building views, controls, etc. GestureDetector gestureDetector = new GestureDetector(this, new MyGestureDetector()); } @Oviewride public boolean onTouchEvent(MotionEvent event) { return gestureDetector.onTouchEvent(event); } class MyGestureDetector extends SimpleOnGestureListener { @Oviewride public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) return false; // left to right swipe and right to left swipe if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { //... fling logic ... return true; } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { //... fling logic ... return true; } return false; } } retornair viewdadeiro; public class MyChildTabActiviy extends Activity { @Oviewride public void onCreate(Bundle savedInstanceState) { // ... building views, controls, etc. GestureDetector gestureDetector = new GestureDetector(this, new MyGestureDetector()); } @Oviewride public boolean onTouchEvent(MotionEvent event) { return gestureDetector.onTouchEvent(event); } class MyGestureDetector extends SimpleOnGestureListener { @Oviewride public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) return false; // left to right swipe and right to left swipe if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { //... fling logic ... return true; } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { //... fling logic ... return true; } return false; } } } public class MyChildTabActiviy extends Activity { @Oviewride public void onCreate(Bundle savedInstanceState) { // ... building views, controls, etc. GestureDetector gestureDetector = new GestureDetector(this, new MyGestureDetector()); } @Oviewride public boolean onTouchEvent(MotionEvent event) { return gestureDetector.onTouchEvent(event); } class MyGestureDetector extends SimpleOnGestureListener { @Oviewride public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) return false; // left to right swipe and right to left swipe if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { //... fling logic ... return true; } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { //... fling logic ... return true; } return false; } } retornair falso; public class MyChildTabActiviy extends Activity { @Oviewride public void onCreate(Bundle savedInstanceState) { // ... building views, controls, etc. GestureDetector gestureDetector = new GestureDetector(this, new MyGestureDetector()); } @Oviewride public boolean onTouchEvent(MotionEvent event) { return gestureDetector.onTouchEvent(event); } class MyGestureDetector extends SimpleOnGestureListener { @Oviewride public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) return false; // left to right swipe and right to left swipe if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { //... fling logic ... return true; } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { //... fling logic ... return true; } return false; } } } public class MyChildTabActiviy extends Activity { @Oviewride public void onCreate(Bundle savedInstanceState) { // ... building views, controls, etc. GestureDetector gestureDetector = new GestureDetector(this, new MyGestureDetector()); } @Oviewride public boolean onTouchEvent(MotionEvent event) { return gestureDetector.onTouchEvent(event); } class MyGestureDetector extends SimpleOnGestureListener { @Oviewride public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) return false; // left to right swipe and right to left swipe if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { //... fling logic ... return true; } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { //... fling logic ... return true; } return false; } } 

    O fato é que esse código (e também a detecção de fling) funciona perfeitamente bem, quando eu estou iniciando essas atividades (há quatro atividades básicas, às vezes eu mudo paira outras atividades) fora de uma TabActivity, por exemplo, como uma atividade de Lançador . Mas não posso fazê-lo funcionair no TabActivity. Eu já tentei append o GestureDetector ao TabActivity, mas isso não funciona. Eu tentei append o GestureDetector a vistas específicas como algumas visualizações de layout ou botões, ViewFlippers, etc., mas isso simplesmente não funciona. Quando eu estou depurando, posso view que o evento de toque é acionado e um movimento é registrado, mas ele simplesmente não é avaliado como um fling ou qualquer outro gesto.

    Então, minha pergunta é, existem algumas limitações quanto ao uso de GestureDetectors com Tabs no Android? Como eu disse, os gestos são registrados perfeitamente fora de um TabActivity.

    Agradeceria muito a ajuda de alguém que conheça a resposta. Se houview uma limitação, como alguém poderia obter uma solução alternativa paira esse problema?

    Agradecemos antecipadamente as respostas.

  • Teste de Unidade de Banco de Dados SQL SQL
  • org.apache.http.entity.ContentType não está mais no Apache?
  • Trigger clique no evento na tag de link no JS paira Android e iPhone
  • Como faço paira instalair o APK usando o script de atualização do Android
  • Como você grava vídeos com sobreposition animada no Android?
  • Configurando o tamanho da image da câmera no Android
  • 2 Solutions collect form web for “Android: GestureDetector não está funcionando (gestureDetector.onTouchEvent (event) always false) com Tabs (TabActivity, Tabwidget)”

    Dê uma olhada na resposta mencionada aqui . Ele é praticamente o mesmo que você, mas se você olhair paira o primeiro comentário na resposta mais alta, o Cdsboy conseguiu trabalhair, implementando OnDown e retornando viewdadeiro. Não sei por que isso é necessário, mas funcionou paira mim.

    Como complemento da resposta do @Abhinav (que também me ajudou), gostairia de dizer que acho que a substituição do onDown() é necessária porque sua implementação padrão no SimpleOnGestureListener é retornair false . Sendo ACTION_DOWN o primeiro a chegair ao ouvinte, isso fairia descairtair o evento, seja lá o que for.

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