2013-04-01 6 views
8

पर क्लिक करते समय गतिविधि के ऑन टचएवेंट() को कॉल नहीं किया जा रहा है, मैं Activity.onTouchEvent() विधि में कुछ बीलॉगिक करना चाहता हूं। यह TextView और अन्य गैर क्लिक करने योग्य दृश्यों के लिए ठीक काम कर रहा है। हालांकि, इसे Button पर चढ़ने के लिए बुलाया नहीं जा रहा है। लेकिन मुझे भी इसकी ज़रूरत है।बटन

यहां कोड है।

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

} 

कृपया मुझे इससे बाहर निकलने में मदद करें।

+2

, Activity.onTouchEvent() केवल कहा जाता है "जब एक टच स्क्रीन घटना से संभाला नहीं गया था इसके तहत किसी भी विचार से "। चूंकि आपका बटन स्पर्श ईवेंट का उपभोग/संचालन करता है, इसलिए गतिविधि कॉल प्राप्त नहीं कर रही है। TextViews क्लिक ईवेंट का उपभोग नहीं कर रहे हैं। जो आप देख रहे हैं वह अपेक्षित व्यवहार होगा। – greg7gkb

+0

मैंने Activity.dispatchTouchEvent() विधि को संभालने से नीचे समाधान जोड़ा। – Noundla

उत्तर

14

मैंने आवश्यकतानुसार प्रेषण टचवेन्ट (मोशनवेन्ट ईवी) का उपयोग किया है। यहां समाधान है।

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

नीचे ओएस स्तर द्वारा स्पर्श ईवेंट को संसाधित करने के तरीके पर पदानुक्रम है।

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

इसके साथ मैंने उन दृश्यों की स्पर्श घटनाओं को प्रतिबंधित कर दिया है जो आवश्यक लेआउट/दृश्यों में नहीं हैं।

+0

बहुत अच्छा समाधान –

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

कृपया अपने ऑनक्रेट विधि में कोड नीचे जोड़ें।

इसमें आप बटन की घटना को नीचे ले जा सकते हैं या स्थानांतरित कर सकते हैं।

बटन अप ईवेंट कॉल करते समय अपना तर्क लिखें।

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

जहां आप बटन के लिए टच लिस्टनर पंजीकृत कर रहे हैं। आपने बटन के लिए केवल क्लिकलिस्ट को लागू किया है। बटन के लिए onTouchEvent() को आमंत्रित करने के लिए, आपको बटन को इस रूप में पंजीकृत करना होगा: button.setOnTouchListener (यह);

0

मुझे एक ही समस्या थी। यह हल करने के लिए बहुत आसान है को दूर करने के लिए अपने बिना:

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

बटन को जोड़ें:

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 
      } 
    } 
} 
डॉक्स प्रति