2012-11-21 24 views
5

मैं फ्रेम लेआउट जब मैं विजेट पर बातचीत करना चाहता हूं, तो कुछ क्लिक करने के लिए, ओवरलेफ्रेम द्वारा ईवेंट लिया जाता है पर क्लिक करें। मैं विजेटव्यू पर क्लिक ईवेंट ट्रॉ ओवरले फ्रेम कैसे क्लिक कर सकता हूं?दर्रा क्लिक करें घटना

संपादित करें:

अब मैं किसी भी तरह MotionEvent कि सिंगल क्लिक और लंबी क्लिक प्रतिनिधित्व के बीच अंतर को देखने के लिए overlayFrame LinearLayout को GestureLister संलग्न करने के लिए कोशिश कर रहा हूँ,। मुझे जिस समस्या का सामना करना पड़ रहा है वह यह है कि इशारा श्रोताओं में ऑनलॉन्गप्रेस हमेशा जो भी करता है, एकल क्लिक या लम्बी क्लिक करता है।

क्या इस व्यवहार के लिए कोई स्पष्टीकरण है? Tnx!

उत्तर

0
इसके बजाय GestureListener का उपयोग कर आप इस तरह से onTouchListener ओवरराइड कर सकते हैं की

: और इस वर्ग के है।

जब टाइमर बाहर चलाता है और एक अप के बीच में आता है अगर यह LongPress

CountDownTimer c; 
    long time=5000; 
    @Override 
    public boolean onTouchEvent(MotionEvent ev) { 
     switch (ev.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       c= new CountDownTimer(5000, 1000) { 
          public void onTick(long millisUntilFinished) { 
            time=millisUntilFinished; 
          } 

          public void onFinish() { 
           Log.i("","LONG PRESS"); 
          }}.start(); 

      break; 
      case MotionEvent.ACTION_UP: 
       if (time>0) { 
        Log.i("example","short click"); 
        c.cancel(); 
       } 
      break; 
     } 

     return true; 
    } 
+0

ठीक है, यह काम करता है पूरी तरह से पहचान ... मैं अब नीचे परत पर क्लिक कैसे पास करूं? – Veljko

+0

मुझे यह कुछ काम कर रहा है ... विचार के लिए tnx! – Veljko

0

शायद ओवरले की विशेषता android:focusable="false" या android:focusableInTouchMode="false" सेट करना पर्याप्त होगा।

आप अपना खुद का ओवरले विजेट भी बना सकते हैं और हमेशा onInterceptTouchEvent विधि को झूठी वापसी के लिए ओवरराइड कर सकते हैं।

public class NotTouchableLinearLayout extends LinearLayout { 

    // Override constructors 
    // ... 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     return false; 
    } 
} 
+0

मैं दोनों की कोशिश की है, कुछ भी नहीं अब तक काम किया। कोई अन्य विचार? – Veljko

+0

InterceptTouchEvent के बजाय ऑन टच ओवरराइड करने का प्रयास करें। –

+0

हे, मैंने ऐसा किया है, लेकिन अब ऑनले पर ओवरक्लेक्लिक पर क्लिक करें। और मैं वस्तुओं को खींच नहीं सकता। – Veljko

0

इसके बजाय शीर्ष लेआउट पर एक GestureListener स्थापित करने की, आप अपने खुद के वर्ग कि LinearLayout फैली बनाना चाहिए और यह onTouchEvent विधि है ओवरराइड करने के लिए। वहाँ आप लंबे क्लिक के तर्क लागू कर सकते हैं \ कम क्लिक आदि

क्लिक ईवेंट पहले विजेट लेआउट के लिए भेजा जाएगा, और केवल अगर यह उन्हें संभाल नहीं करता है (इसलिए यह onTouchEvent रिटर्न false है), आप होगा उन्हें शीर्ष लेआउट पर ले जाएं।

संपादित करें:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_margin="10dp" > 

<LinearLayout 
android:id="@+id/widgetView" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_gravity="center" 
android:layout_margin="10dp" 
android:gravity="center" > 
</LinearLayout> 

<com.example.touchtesting.MyLinearLayout 
android:id="@+id/widgetOverlayFrame" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:clickable="false" > 
</com.example.touchtesting.MyLinearLayout> 

</FrameLayout> 

परिवर्तन अपने पैकेज के नाम के com.example.touchtesting

 public class MyLinearLayout extends LinearLayout{ 

     public MyLinearLayout(Context context, AttributeSet attrs) { 
      super(context, attrs); 
     } 

     private long startClick = 0; 

     @Override 
     public boolean onTouchEvent(MotionEvent ev) { 
      switch (ev.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        startClick = ev.getEventTime(); 
        break; 
       case MotionEvent.ACTION_CANCEL: 
       case MotionEvent.ACTION_UP: 
        if (ev.getEventTime() - startClick < 500) { 
         Log.i("example","short click"); 
        } 
        else { 
         Log.i("example","long click"); 
        } 
        break; 
      } 

      return true; 
     } 

    } 
+0

क्या आप कुछ कोड प्रदान कर सकते हैं? – Veljko

+0

ने उत्तर – Rotem

+0

संपादित किया है, मैं अब कोशिश करूँगा;) tnx ... यह sence बनाता है ... उम्मीद है कि यह काम करता है ... मैंने इसके साथ एक दिन खो दिया है। – Veljko

0

रद्द लंबे क्लिक्स widgetView LinearLayout के माध्यम से पारित करने के लिए android:longClickable="true" जोड़ने प्राप्त करने के लिए होगा यह लंबे समय तक दबाए कॉल करेंगे। (के लिए साधारण क्लिक के android:clickable="true" जोड़ें)

तो widgetView हो जाता है:

<LinearLayout 
    android:id="@+id/widgetView" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center" 
    android:layout_margin="10dp" 
    android:gravity="center" 
    android:longClickable="true"> 
</LinearLayout> 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^