2013-04-01 12 views
8

Chcę wykonać pewną metodę B.logic w metodzie Activity.onTouchEvent(). Działa dobrze dla TextView i innych nieklikalnych widoków. Jednak nie jest on wywoływany po kliknięciu na Button. Ale ja też tego potrzebuję.Aktywność onTouchEvent() nie jest wywoływana podczas klikania na przycisk

Oto kod.

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); 
    } 

} 

Proszę mi pomóc rozwiązać ten problem.

+2

Per docs, Activity.onTouchEvent() jest wywoływana tylko „kiedy wydarzenie ekran dotykowy nie był obsługiwany przez którykolwiek z poglądów pod nim ". Ponieważ przycisk zużywa/obsługuje wydarzenie dotykowe, aktywność nie odbiera połączenia. TextView nie pochłaniają zdarzenia kliknięcia. To, co obserwujesz, będzie oczekiwanym zachowaniem. – greg7gkb

+0

Dodałem rozwiązanie poniżej, posługując się metodą Activity.dispatchTouchEvent(). – Noundla

Odpowiedz

14

Użyłem dispatchTouchEvent (MotionEvent ev) zgodnie z wymaganiami. Oto rozwiązanie.

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

Poniżej przedstawiono hierarchię sposobu przetwarzania zdarzenia dotyku na poziomie systemu operacyjnego.

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

Dzięki temu ograniczyłem dotykowe zdarzenia widoków, które nie mają wymaganych układów/widoków.

+0

Bardzo ładne rozwiązanie –

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

Proszę dodać poniższy kod w swojej metodzie onCreate.

w tym przypadku można obniżyć, przesunąć lub zwiększyć wydarzenie przycisku.

Napisz swoją logikę, gdy wywołaj zdarzenie Button up.

1

Miejsce rejestracji przycisku touchListener dla przycisku. Zaimplementowałeś tylko clickListener dla przycisku. Aby wywołać przycisk onTouchEvent() for, musisz zarejestrować przycisk jako: button.setOnTouchListener (this);

0

Miałem ten sam problem. Jest to bardzo łatwe do rozwiązania, bez odrywania:

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

dodać do przycisku:

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 
      } 
    } 
} 
Powiązane problemy