2014-12-12 10 views
6

प्रश्न का संक्षिप्त संस्करण: मैं एंड्रॉइड में सॉफ्ट इनपुट/कीबोर्ड पर लंबी प्रेस घटना कैप्चर कैसे कर सकता हूं?एंड्रॉइड: सॉफ्ट इनपुट/कीबोर्ड पर लंबी प्रेस घटना कैप्चर कैसे करें?

लांग संस्करण: एक Android ऐप्लिकेशन में, हम एक बहु लाइन EditText है, और हम इस व्यवहार करना चाहते हैं: 1. डिफ़ॉल्ट रूप से, यह एक हो गया बटन दिखा रहा है इससे टैप करके, मुलायम इनपुट/कुंजीपटल होगा, बंद रहा। 2. यदि उपयोगकर्ता लंबे समय से बटन दबाएगा, तो इसका व्यवहार ENTER बटन में बदल दिया जाएगा, और EditText में एक नई पंक्ति होगी।

# 1 आवश्यकता के लिए, मैं यहाँ में समाधान का प्रयोग किया: https://stackoverflow.com/a/12570003/4225326

आवश्यकता # 2 के लिए, अवरुद्ध सवाल मेरे पास है, कितनी देर तक प्रेस घटना पर कब्जा करने की है। मैंने एडिटर एक्शन लिस्टनर सेट किया है, लेकिन कैप्चर की गई घटना शून्य है: http://developer.android.com/reference/android/widget/TextView.OnEditorActionListener.html मैंने दस्तावेज़ की खोज की, लंबी प्रेस संबंधित विधि हार्ड कीबोर्ड के लिए है: http://developer.android.com/reference/android/view/View.html#onKeyLongPress(int, android.view.KeyEvent), मुझे सॉफ्ट इनपुट/कीबोर्ड के लिए कोई नहीं मिल रहा है ।

इस प्रश्न को देखने के लिए धन्यवाद।

+0

आप एक 'doneButton.setOnLongClickListener जोड़ने की कोशिश की है (नई OnLongClickListener() {...});' – k3b

उत्तर

0

मुझे यह जवाब स्वयं नहीं मिला, इसलिए मैंने मैन्युअल रूप से समाधान को कोड किया। मैंने onPress() और onRelease()KeyboardView.OnKeyboardActionListener की घटनाओं पर टाइमर का उपयोग किया। यहां महत्वपूर्ण कोड है। ब्रेवटी के लिए कई ट्रे/कैच छोड़ दिए गए। अंग्रेजी में, जब एक कुंजी दबाया जाता है, तो मैं एक टाइमर शुरू कर रहा हूं जो एक ही समय तक प्रतीक्षा करता है क्योंकि एक लंबे समय तक क्लिक करने की घटना सामान्य रूप से प्रतीक्षा करती है (ViewConfiguration.getLongPressTimeout()), फिर मूल थ्रेड पर एक ऑन-लांग-क्लिक ईवेंट निष्पादित करती है। बाद की मुख्य रिलीज और कुंजी प्रेस किसी भी सक्रिय टाइमर को रद्द कर सकते हैं।

public class MyIME 
    extends InputMethodService 
    implements KeyboardView.OnKeyboardActionListener { 
    : 
    : 
    private Timer timerLongPress = null; 
    : 
    : 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     : 
     : 
     timerLongPress = new Timer(); 
     : 
     : 
    } 

    @Override 
    public void onRelease(final int primaryCode) { 
     : 
     : 
     timerLongPress.cancel(); 
     : 
     : 
    } 

    @Override 
    public void onPress(final int primaryCode) { 
     : 
     : 
     timerLongPress.cancel(); 
     : 
     : 
     timerLongPress = new Timer(); 

     timerLongPress.schedule(new TimerTask() { 

      @Override 
      public void run() { 

       try { 

        Handler uiHandler = new Handler(Looper.getMainLooper()); 

        Runnable runnable = new Runnable() { 

         @Override 
         public void run() { 

          try { 

           MyIME.this.onKeyLongPress(primaryCode); 

          } catch (Exception e) { 
           Log.e(MyIME.class.getSimpleName(), "uiHandler.run: " + e.getMessage(), e); 
          } 

         } 
        }; 

        uiHandler.post(runnable); 

       } catch (Exception e) { 
        Log.e(MyIME.class.getSimpleName(), "Timer.run: " + e.getMessage(), e); 
       } 
      } 

     }, ViewConfiguration.getLongPressTimeout()); 
     : 
     : 
    } 

    public void onKeyLongPress(int keyCode) { 
     // Process long-click here 
    } 
+0

मैं इतना यकीन नहीं अपने समाधान के रूप में इरादा काम करेंगे कर रहा हूँ। प्रलेखन के अनुसार, ऑनप्रेस() पर पहले() पर कॉल किया जाता है() को एक बार और बाद में Key() पर कॉल किया जाता है। इसका मतलब यह होगा कि, केई को निष्पादित किया जा रहा है इससे कोई फर्क नहीं पड़ता। यदि आपका समाधान लागू किया गया है तो लंबी प्रेस के लिए, दोनों की सामान्य व्यवहार और लंबे प्रेस व्यवहार को निष्पादित किया जाएगा। – flide

+0

एक और मुद्दा जिसे मैं कल्पना कर सकता हूं - "मैं कहां सेट करूं और मैं लंबे प्रेस कुंजी कोड को कैसे प्राप्त करूं?"। यह विशेष रूप से परेशानी होगी क्योंकि एक्सएमएल में संरचना ऐसी परिस्थितियों के लिए उपलब्ध नहीं है। कोई टिप्पणी? – flide

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