2011-05-31 20 views
12

मैं उस एप्लिकेशन पर काम कर रहा हूं जिसमें उपयोगकर्ता को लंबे समय तक बटन दबाकर रखने की आवश्यकता होती है।एंड्रॉइड - लंबी प्रेस का पता लगाएं

मैं उस पल का पता कैसे लगा सकता हूं जो उपयोगकर्ता: प्रेस को समाप्त करता है या अपनी स्पर्श स्थिति को स्थानांतरित करता है?

धन्यवाद

+0

आपको और अधिक समझाने की आवश्यकता है कि उपयोगकर्ता चलती स्थिति क्यों महत्वपूर्ण है। एक लंबी प्रेस के अंत का पता लगाने के लिए, बस setOnLongClickListener() का उपयोग करें। जब उपयोगकर्ता बटन जारी करता है तो onLongClick() विधि स्वचालित रूप से कॉल की जाएगी। – Squonk

+2

यह गलत है - ऑन-लॉन्गक्लिक विधि को एक लंबे क्लिक के रूप में जल्द ही ट्रिगर किया जाता है - यानी: जैसे ही "लंबे क्लिक" के लिए टाइमआउट हुआ है, जब उपयोगकर्ता बटन को रिलीज़ नहीं करता है। –

उत्तर

37

मुझे लगता है कि उस बटन के लिए ऑन लोंगक्लिक लिस्टनर() और टचलिस्टर() के संयोजन का उपयोग करना आपकी सबसे अच्छी शर्त है। आपको टच श्रोता पर कुछ ईवेंट पकड़ने की आवश्यकता होगी क्योंकि यह प्रत्येक स्पर्श ईवेंट के लिए ट्रिगर करेगा। निम्नलिखित की तरह

कोशिश कुछ:

class Blah extends Activity { 
    private Button mSpeak; 
    private boolean isSpeakButtonLongPressed = false; 

    @Override 
    public void onCreate(Bundle icicle) { 
      super.onCreate(icicle); 
      setContentView(R.layout.blahlayout); 
      Button mSpeak = (Button)findViewById(R.id.speakbutton); 
      mSpeak.setOnLongClickListener(speakHoldListener); 
      mSpeak.setOnTouchListener(speakTouchListener); 
    } 

    private View.OnLongClickListener speakHoldListener = new View.OnLongClickListener() { 

      @Override 
      public boolean onLongClick(View pView) { 
       // Do something when your hold starts here. 
       isSpeakButtonLongPressed = true; 
       return true; 
      } 
    } 

    private View.OnTouchListener speakTouchListener = new View.OnTouchListener() { 

      @Override 
      public boolean onTouch(View pView, MotionEvent pEvent) { 
       pView.onTouchEvent(pEvent); 
       // We're only interested in when the button is released. 
       if (pEvent.getAction() == MotionEvent.ACTION_UP) { 
        // We're only interested in anything if our speak button is currently pressed. 
        if (isSpeakButtonLongPressed) { 
         // Do something when the button is released. 
         isSpeakButtonLongPressed = false; 
        } 
       } 
       return false; 
      } 
    } 
} 
+0

यह मेरे लिए काम किया, धन्यवाद! –

+0

धन्यवाद जॉन, महान समाधान। – alfdev

+3

जब मैंने बटन दबाया तो कार्रवाई दो बार चली गई, मैंने इसे टचलिस्टर के अंदर झूठी जगह के बजाय सत्य लौटकर तय किया। – DAVIDBALAS1

0

मैं onFocusChanged -Listener इस के लिए इस्तेमाल किया जा सकता है।

1

मुझे लगता है कि आप इसके लिए OnTouchListener का उपयोग कर सकते हैं।

2

ये जवाब बहुत जटिल हैं। onClickOnClickListener से अभी भी लंबी प्रेस के अंत में कॉल किया जाता है यदि आप false लौटाते हैं। एक लंबी प्रेस के अंत का पता लगाने के लिए यह सबसे आसान जगह है।

यह विशेष रूप से पता करने के लिए क्योंकि अगर आप onTouch मार्ग को लागू करते हुए onLongClick से false लौटने महत्वपूर्ण है (डिफ़ॉल्ट रूप में आप देता है और अक्सर आप क्या चाहते हैं), अपने onClick कोड आप बिना अपने लंबे प्रेस के अंत में कहा जा सकता है इसे महसूस करना

private boolean takingVideo = false; 

captureButton.setOnClickListener(v -> { 
    // onClick gets called after normal click or long click 
    if(takingVideo) { 
     saveVideo(); 
    } else { 
     takePhoto(); 
    } 
}); 

captureButton.setOnLongClickListener(v -> { 
    takeVideo(); 

    return false; 
}); 

private void takePhoto() { 
    // Save the photo 
} 

private void takeVideo() { 
    takingVideo = true; 
    // Start capturing video 
} 

private void saveVideo() { 
    takingVideo = false; 
    // Save the video 
} 

आप देख सकते हैं, तर्क बहुत सीधे आगे है जब आप एंड्रॉयड एक OnClickListener के अंत स्पर्श घटना का प्रचार करते हो जाता है:

यहाँ एक उदाहरण एक फ़ोटो या वीडियो पर कब्जा करने पर आधारित है।

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