2011-11-22 19 views
7

मैं बैक कुंजी प्रेस की कार्यक्षमता को ओवरराइड करने का प्रयास कर रहा हूं। जब उपयोगकर्ता इसे एक बार दबाता है, तो मैं इसे पिछली स्क्रीन पर वापस आना चाहता हूं। हालांकि, जब बैक कुंजी लंबी दबाई जाती है (के लिए, मान लें, दो सेकंड या उससे अधिक), मैं एप्लिकेशन से बाहर निकलना चाहता हूं।लंबी कुंजी प्रेस और नियमित कुंजी प्रेस के बीच अंतर कैसे करें?

अब तक, मैं अपने गतिविधि में इन दोनों तरीकों ओवरराइड है

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event){ 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     //manage short keypress 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 

@Override 
public boolean onKeyLongPress(int keyCode, KeyEvent event){ 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     //manage long keypress (different code than short one) 
     return true; 
    } 
    return super.onKeyLongPress(keyCode, event); 
} 

लेकिन onKeyLongPress कॉलबैक कभी नहीं कहा जाता है, क्योंकि घटना हमेशा onKeyDown विधि द्वारा प्राप्त होता है।

क्या दोनों विधियां काम करने का कोई तरीका है? या इसे onKeyDown में किया जाना है और इसे पहचानने के लिए पुनरावृत्ति/मिलीसेकंड की संख्या का उपयोग करें?

+0

घास इस लिंक [keyevent डॉक] (http://developer.android.com/reference/android/view/KeyEvent.Callback.html#onKeyDown%28int,%20android की जाँच करें। देखें। KEEvent% 29) –

उत्तर

12

कारण onKeyLongPress कभी नहीं कहा जाता है, यह है कि आप onKeyDown में फ्रेमवर्क को बताने के बिना सच में लौटते हैं कि यह एक लंबी प्रेस हो सकती है - जिससे KeyEvent विभिन्न ईवेंट हैंडलर के माध्यम से अपने प्रवाह को रोक सकता है।

  1. इससे पहले कि आप सच लौटने के लिए, फोन event.startTracking() रूप documentation में विस्तार से बताया:

    आपको क्या करने की जरूरत है इस है।

  2. onKeyLongPress में लंबी प्रेस को संभालें।

नीचे के रूप में लागू है और यह काम करेगा:

@Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if(keyCode == KeyEvent.KEYCODE_BACK) { 
     event.startTracking(); 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
    } 

    @Override 
    public boolean onKeyUp(int keyCode, KeyEvent event) { 
    if(keyCode == KeyEvent.KEYCODE_BACK) { 
     //Handle what you want on short press.  
     return true; 
    } 

    return super.onKeyUp(keyCode, event); 
    } 

    @Override 
    public boolean onKeyLongPress(int keyCode, KeyEvent event) { 
    if(keyCode == KeyEvent.KEYCODE_BACK) { 
     //Handle what you want in long press. 
     return true; 
    } 
    return super.onKeyLongPress(keyCode, event); 
    } 
+0

समस्या यह है कि सच लौटने से पहले, मुझे कुछ चीजें करना पड़ता है जो घटना नियमित रूप से प्रेस या लंबी प्रेस के लिए पूरी तरह अलग होती हैं। तो किसी भी मामले में, मुझे 'स्टार्टट्रैकिंग' कॉल करने से पहले 'ऑनकेडाउन' विधि पर लंबी प्रेस का पता लगाना है, है ना? –

+0

मैंने अपने कोड में टिप्पणियों को संपादित करने के लिए संपादित किया जो मेरा मतलब था। यदि कुंजीपटल छोटा है तो मैं केवल 'ऑनडाउन' में सत्य वापस करना चाहता हूं। अन्यथा लंबे कीप्रेस हैंडलर को प्रचारित करें। –

+0

मैंने आपके द्वारा आवश्यक कार्यक्षमता प्रदान करने के लिए अपना उत्तर संपादित किया। – kaspermoerch

2

onKeyUp() का उपयोग नहीं क्यों onKeyDown() के साथ ही? onKeyDown() के दौरान आप नहीं जानते कि यह एक लंबी प्रेस है या नहीं, क्योंकि जैसे ही कुंजी दबाई जाती है और आपको नहीं पता कि उपयोगकर्ता कितनी देर तक कुंजी पकड़ने का इरादा रखता है। जैसा कि कास्परमोर्च सही ढंग से कहता है, आपको 10 में startTracking पर कॉल करने की आवश्यकता है, और true लौटाएं। फिर अपने onKeyUp() में आप event.isTracking() और event.isLongPress() पर कॉल कर सकते हैं यह निर्धारित करने के लिए कि क्या लंबी प्रेस या छोटी प्रेस के रूप में चीजों को संभालना है या नहीं।

+0

काम नहीं करता है।'isTracking' सही लौटाता है लेकिन लगभग 5 सेकंड के लिए बटन दबाए जाने के बावजूद 'isLongPress' झूठा रिटर्न देता है। शायद यह सिम्युलेटर पर परीक्षण नहीं किया जा सकता है? –

2

मुझे लगता है कि इसे संभालने का सबसे अच्छा तरीका इस तरह है।

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

कोड:

private boolean _handledMenuButton=false; 

@Override 
public boolean onKeyUp(final int keyCode,final KeyEvent event) { 
    switch(keyCode) { 
     case KeyEvent.KEYCODE_MENU: 
      if (!_handledMenuButton) { 
       //Handle single clicking here 
      } 
      _handledMenuButton=false; 
      return true; 
    } 
    return super.onKeyUp(keyCode,event); 
} 

@Override 
public boolean onKeyLongPress(final int keyCode, final KeyEvent event) { 
    switch(keyCode) { 
     case KeyEvent.KEYCODE_MENU: 
      //Handle long clicking here 
      _handledMenuButton=true; 
      return true; 
    } 
    return super.onKeyLongPress(keyCode,event); 
} 

@Override 
public boolean onKeyDown(final int keyCode,final KeyEvent event) { 
    switch(keyCode) { 
     case KeyEvent.KEYCODE_MENU: 
      _handledMenuButton=false; 
      event.startTracking(); 
      return true; 
    } 
    return super.onKeyDown(keyCode,event); 
} 

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

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