2013-04-01 7 views
8

Desidero eseguire alcune operazioni con B.logic nel metodo Activity.onTouchEvent(). Funziona perfettamente per TextView e altre visualizzazioni non selezionabili. Tuttavia, non viene chiamato overclicking di Button. Ma ho bisogno anche di questo.L'attività di onTouchEvent() non viene chiamata mentre si fa clic sul pulsante

Ecco il codice.

public class MainActivity extends Activity { 
    private static final String TAG = MainActivity.class.getSimpleName(); 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     findViewById(R.id.button1).setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Toast.makeText(MainActivity.this, "Oh shit!! click performed... :(", Toast.LENGTH_LONG).show(); 

      } 
     }); 



    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     Log.d(TAG, "ssssssssssssssssssssssss:touch"); 
     return super.onTouchEvent(event); 
    } 

    public boolean dispatchTouchEvent(MotionEvent event) { 
     int eventaction=event.getAction(); 

     switch(eventaction) { 
     case MotionEvent.ACTION_MOVE: 
      break; 
     default: 
      break; 
     } 

     return super.dispatchTouchEvent(event); 
    } 

} 

Please help me per risolvere da questo.

+2

Per la documentazione, Activity.onTouchEvent() viene chiamato solo "quando un evento touch screen non era gestito da una qualsiasi delle viste sotto di essa ". Poiché il tuo pulsante consuma/gestisce l'evento touch, l'attività non riceve la chiamata. Le TextView non consumano l'evento click. Quello che stai osservando sarebbe il comportamento previsto. – greg7gkb

+0

Ho aggiunto la soluzione seguente gestendo il metodo Activity.dispatchTouchEvent(). – Noundla

risposta

14

Ho usato dispatchTouchEvent (MotionEvent ev) come richiesto. Ecco la soluzione.

private boolean isInSideClicked = false; 
    public boolean dispatchTouchEvent(MotionEvent event) { 
     if(event.getAction() == MotionEvent.ACTION_DOWN) { 
      View content = findViewById(R.id.textView1); 
      int[] contentLocation = new int[2]; 
      content.getLocationOnScreen(contentLocation); 
      Rect rect = new Rect(contentLocation[0], 
           contentLocation[1], 
           contentLocation[0] + content.getWidth(), 
           contentLocation[1] + content.getHeight()); 

      View frame = findViewById(R.id.editText1); 
      int[] frameLocation = new int[2]; 
      frame.getLocationOnScreen(frameLocation); 
      Rect framerect = new Rect(frameLocation[0], 
        frameLocation[1], 
        frameLocation[0] + frame.getWidth(), 
        frameLocation[1] + frame.getHeight()); 
      Log.d(TAG, "rect: "+rect.bottom+" , "+rect.top+" , "+rect.left+" , "+rect.right); 
      Log.d(TAG, "FrameRect: "+framerect.bottom+" , "+framerect.top+" , "+framerect.left+" , "+framerect.right); 
      Log.d(TAG, "x: "+event.getX()+" y: "+event.getY()); 

      if((rect.contains((int)event.getX(), (int)event.getY()) || framerect.contains((int)event.getX(), (int)event.getY()))) { 
       isInSideClicked = true; 
      } 
      if(isInSideClicked){ 
       return super.dispatchTouchEvent(event); 
      }else{ 
       return true; 
      } 
     }else if(event.getAction() == MotionEvent.ACTION_UP && isInSideClicked) { 
      isInSideClicked = false; 
      return super.dispatchTouchEvent(event); 
     }else if(event.getAction() == MotionEvent.ACTION_MOVE && isInSideClicked) { 
      return super.dispatchTouchEvent(event); 
     }else{ 
      isInSideClicked = false; 
      return true;  
     } 
    } 

Segue la gerarchia su come l'evento di tocco viene elaborato dal livello del SO.

Activity.dispatchTouchEvent() 
ViewGroup.dispatchTouchEvent() 
View.dispatchTouchEvent() 
View.onTouchEvent() 
ViewGroup.onTouchEvent() 
Activity.onTouchEvent() 

Con questo ho limitato gli eventi di tocco delle viste che non sono nei layout/viste richiesti.

+0

Soluzione molto bella –

0
Please add below given 2 line in your xml hope it will help you its working fine for me. 

    **android:focusable="false" 
    android:focusableInTouchMode="false"** 


    <Button 
      android:id="@+id/button2" 
      android:layout_width="80dp" 
      android:layout_height="40dp" 
      android:layout_alignParentRight="true" 
      android:layout_below="@+id/button1" 
      android:layout_marginTop="3dp" 
      android:background="#FFFFFF" 
      android:focusable="false" 
      android:focusableInTouchMode="false" 
      android:text="Delete" 
      android:textColor="#0099CC" /> 
0

Aggiungi il codice riportato di seguito nel tuo metodo onCreate.

in questo si può ottenere giù, spostare o su evento del pulsante.

Scrivi la tua logica quando chiamata evento pulsante.

findViewById(R.id.btn).setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 

      switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       Toast.makeText(Main.this, 
         "Oh shit!! click down performed... :(", 
         Toast.LENGTH_LONG).show(); 
       break; 
      case MotionEvent.ACTION_MOVE: 
       break; 
      case MotionEvent.ACTION_UP: 
       Toast.makeText(Main.this, 
         "Oh shit!! click up performed... :(", 
         Toast.LENGTH_LONG).show(); 
       break; 
      default: 
       break; 
      } 
      return true; 
     } 
    }); 
1

Dove è stato registrato il touchListener per il pulsante. Hai implementato solo clickListener per il pulsante. Per richiamare il pulsante onTouchEvent() per, è necessario registrare il pulsante come: button.setOnTouchListener (this);

0

Ho avuto lo stesso problema. E 'molto facile da risolvere, senza rimuovere il vostro:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    Log.d(TAG, "ssssssssssssssssssssssss:touch"); 
    return super.onTouchEvent(event); 
}; 

aggiungere al pulsante:

button.setOnTouchListener(new OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     //YOUR CODE HERE 
     if(v==button){ 
      //Your button has been pressed 
     } 
     else { 
      //Other View element has been pressed 
      } 
    } 
} 
Problemi correlati