2011-12-22 13 views
7

मैं एंड्रॉइड में वर्चुअल कीबोर्ड ऊंचाई का पता लगाने की कोशिश कर रहा हूं।एंड्रॉइड में पॉइंटर ईवेंट कैसे भेजें

मैं एक समान विषय पाया: Get the height of virtual keyboard in Android

ऐसा लगता है लेखक ऊंचाई पता लगाने के लिए एक रास्ता मिल गया:

मैं इसे पाने के लिए एक रास्ता मिल गया। वर्चुअल कीबोर्ड खोलने का अनुरोध करने के बाद, मैं उत्पन्न करता हूं जो सूचक उत्पन्न करता है। उनका वाई समन्वय डिवाइस की ऊंचाई और घटता से शुरू होता है।

मुझे समझ में नहीं आता कि यह कैसे करना है।

उत्तर

3

मैं लिंक है कि आप पोस्ट पर प्रदान की जाती कोड का उपयोग करेंगे:

// Declare Variables 

int softkeyboard_height = 0; 
boolean calculated_keyboard_height; 
Instrumentation instrumentation; 

// Initialize instrumentation sometime before starting the thread 
instrumentation = new Instrumentation(); 

mainScreenView अपने आधार देखने के लिए, अपनी गतिविधि का दृश्य है। m (ACTION_DOWN) और m1 (ACTION_UP) स्पर्श ईवेंट हैं जो Instrumentation#sendPointerSync(MotionEvent) का उपयोग करके प्रेषित किए जाते हैं।

java.lang.SecurityException:: तर्क है कि एक MotionEvent जहां कुंजीपटल प्रदर्शित किया जा रहा है निम्नलिखित SecurityException कारण होगा के लिए रवाना किया है किसी अन्य अनुप्रयोग इंजेक्शन INJECT_EVENTS अनुमति

तो, हम शुरू की आवश्यकता है स्क्रीन के निचले हिस्से में और लूप के प्रत्येक पुनरावृत्ति पर अपना रास्ता बनायें (y को कम करके)। पुनरावृत्तियों की कुछ संख्या के लिए, हमें एक सुरक्षा अपवाद (जिसे हम पकड़ लेंगे) प्राप्त करेंगे: यह इंगित करेगा कि मोशनवेन्ट कीबोर्ड पर हो रहा है। पल y काफी छोटा हो जाता है (जब इसकी सिर्फ कीबोर्ड के ऊपर), हम लूप से बाहर तोड़ने के लिए और का उपयोग करके कीबोर्ड की ऊंचाई की गणना करेंगे:

softkeyboard_height = mainScreenView.getHeight() - y; 

कोड:

Thread t = new Thread(){ 
     public void run() { 
      int y = mainScreenView.getHeight()-2; 
      int x = 10; 
      int counter = 0; 
      int height = y; 
      while (true){ 
       final MotionEvent m = MotionEvent.obtain(
         SystemClock.uptimeMillis(), 
         SystemClock.uptimeMillis(), 
         MotionEvent.ACTION_DOWN, 
         x, 
         y, 
         1); 
       final MotionEvent m1 = MotionEvent.obtain(
         SystemClock.uptimeMillis(), 
         SystemClock.uptimeMillis(), 
         MotionEvent.ACTION_UP, 
         x, 
         y, 
         1); 
       boolean pointer_on_softkeyboard = false; 
       try { 
        instrumentation.sendPointerSync(m); 
        instrumentation.sendPointerSync(m1); 
       } catch (SecurityException e) { 
        pointer_on_softkeyboard = true; 
       } 
       if (!pointer_on_softkeyboard){ 
        if (y == height){ 
         if (counter++ < 100){ 
          Thread.yield(); 
          continue; 
         } 
        } else if (y > 0){ 
         softkeyboard_height = mainScreenView.getHeight() - y; 
         Log.i("", "Soft Keyboard's height is: " + softkeyboard_height); 
        } 
        break; 
       } 
       y--; 

      } 
      if (softkeyboard_height > 0){ 
       // it is calculated and saved in softkeyboard_height 
      } else { 
       calculated_keyboard_height = false; 
      } 
     } 
    }; 
    t.start(); 

Instrumentation#sendPointerSync(MotionEvent):

एक पॉइंटर ईवेंट डिस्पैच करें। प्राप्तकर्ता उसके ईवेंट प्रसंस्करण से वापस लौटने के बाद कुछ बिंदु पर समाप्त हो गया है, हालांकि इसमें ईवेंट से पूरी तरह से प्रतिक्रिया समाप्त नहीं हो सकता है - उदाहरण के लिए, यदि परिणामस्वरूप इसके प्रदर्शन को अपडेट करने की आवश्यकता है, तो यह अभी भी हो सकता है ऐसा करने की प्रक्रिया।

+0

क्या यह एक सार्वजनिक एपीआई है? मुझे 'INTERNAL_POINTER_META_STATE' के बारे में दस्तावेज़ नहीं मिल रहा है। – rid

+0

@rid इसके बारे में क्षमा करें। 'INTERNAL_POINTER_META_STATE' एक पूर्णांक निरंतर है। प्रश्न के उद्देश्य के लिए, किसी भी पूर्णांक मूल्य का उपयोग करना काम करेगा। मैंने उपरोक्त कोड संपादित किया है। इस पर ध्यान दिलाने के लिए धन्यवाद। – Vikram

+0

फिर भी, क्या एंड्रॉइड के भविष्य के संस्करण में गायब होने का मौका मिलने के बिना इसका उपयोग सुरक्षित है? क्या यह '1' हमेशा एक जैसा होने की गारंटी है? क्या यह Google द्वारा आधिकारिक तौर पर कहीं भी दस्तावेज किया गया है? क्या आप भंगुर कोड बनाने के डर के बिना इस पर भरोसा कर सकते हैं? – rid

1

OnGlobalLayoutListener का उपयोग करें, यह मेरे लिए पूरी तरह से काम करता है।

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