9

में कीबोर्ड ईवेंट पढ़ें मैं एंड्रॉइड वेब व्यू में महत्वपूर्ण घटनाओं को सुनने की कोशिश कर रहा हूं। उदाहरण जब उपयोगकर्ता एक फॉर्म भर रहा है, मुझे मुख्य कार्यक्रम प्राप्त करना चाहिए। यह मेरा WebView कोडएंड्रॉइड वेबव्यू

public class MyWebView extends WebView implements OnKeyListener 
{ 
    ..... 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) 
    { 
     Log.i("PcWebView", "onKeyDown keyCode=" + keyCode); 
     return super.onKeyDown(keyCode, event); 
    } 

    @Override 
    public boolean onKeyUp(int keyCode, KeyEvent event) 
    { 
     Log.i("PcWebView", "onKeyUp keyCode=" + keyCode); 
     return super.onKeyUp(keyCode, event); 
    } 

    @Override // Listener is initialized in the constructor 
    public boolean onKey(View v, int keyCode, KeyEvent event) 
    { 
     Log.i("PcWebView", "onKey keyCode=" + keyCode); 
     return false; 
    } 

    ..... 

} 

तरीकों onKeyDown, onKeyUp और onKey के न कहा जा रहा है है जब बक्सें या textareas में उपयोगकर्ता प्रकार। क्या यह हासिल करना संभव है या एंड्रॉइड ने संभावित गोपनीयता उल्लंघन के इस bccos को प्रतिबंधित कर दिया है?

+0

आप यह काम कर रहा करने के लिए सक्षम थे? इस समय मुझे एक ही समस्या है ... –

+4

नहीं, इस प्रकार की कार्रवाई को असुरक्षित माना जाता है क्योंकि पासवर्ड इत्यादि दर्ज किया जा सकता है। तो एंड्रॉइड में इसकी अनुमति नहीं है। –

उत्तर

9

सावधानी! यह समाधान केवल अंग्रेजी अक्षरों का समर्थन करता है।

एचटीएमएल स्रोत कोड या जेएस घटनाओं तक पहुंच के बिना पूरा किया गया। सॉफ्ट और हार्डवेयर कीबोर्ड दोनों के लिए एंड्रॉइड 5.0.2 पर मेरे लिए काम करता है।

public class MyWebView extends WebView { 


    @Override 
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) { 
     return new BaseInputConnection(this, false); //this is needed for #dispatchKeyEvent() to be notified. 
    } 

    @Override 
    public boolean dispatchKeyEvent(KeyEvent event) { 
     boolean dispatchFirst = super.dispatchKeyEvent(event); 
     // Listening here for whatever key events you need 
     if (event.getAction() == KeyEvent.ACTION_UP) 
      switch (event.getKeyCode()) { 
       case KeyEvent.KEYCODE_SPACE: 
       case KeyEvent.KEYCODE_ENTER: 
        // e.g. get space and enter events here 
        break; 
      } 
     return dispatchFirst; 
    } 
} 

यहाँ चाल एक सरल एक के साथ InputConnection की व्यवस्था के द्वारा उपलब्ध कराया इनपुट कार्यान्वयन अधिभावी है। डेवलपर्स को डिफ़ॉल्ट रूप से ईवेंट तक पहुंचने से रोकना उद्देश्य पर Googlers द्वारा किया गया था। क्योंकि मुख्य ईवेंट इनपुट अब एकमात्र नहीं है। इशारे हैं, आवाज और अधिक आ रहा है। आधिकारिक सिफारिश है "टेक्स्ट प्रविष्टि के लिए विरासत कुंजी घटनाओं पर भरोसा करना बंद करें"। यहां और विवरण की जाँच करें: https://code.google.com/p/android/issues/detail?id=42904#c15

+0

फोकस टेक्स्ट बॉक्स पर होने पर यह काम करता है? –

+0

@ पीसी। हाँ यकीनन। जैसे यदि वेबव्यू में लोड किया गया पृष्ठ https://www.google.com.ua जैसा है, तो आपको टेक्स्ट बॉक्स में प्रत्येक अक्षर इनपुट पर अधिसूचित किया जाता है। – riwnodennyk

+0

इससे समस्याएं पैदा हो सकती हैं। चूंकि आप 'EditorInfo' को अनदेखा करते हैं (जिसमें' इनपुट टाइप 'जानकारी होती है) इससे गलत कीबोर्ड दिखाया जा सकता है। जैसे। अंतिम प्रयोग किया गया कीबोर्ड संख्यात्मक है लेकिन उपयोगकर्ता टेक्स्ट फ़ील्ड में क्लिक करता है, संख्यात्मक कीबोर्ड दिखाई देता है (दिलचस्प बात यह केवल कुछ डिवाइसों जैसे एचटीसी वन एम 8 पर हो रही थी)। मैं एंटर पर कीबोर्ड छिपाने की कोशिश कर रहा था, मुझे इसे एक अलग तरीके से प्राप्त करना था - जब यूआरएल लोड होने वाला है तो मैंने कीबोर्ड छुपाया था ('WebViewClient.shouldOverrideUrlLoading()')। – hmac

-2

मैं अगर तुम यह पहले से ही करने की कोशिश की पता नहीं है लेकिन ... वैकल्पिक रूप से, आप अपने "MyWebViewClass" के लिए जावास्क्रिप्ट सक्षम कर सकते हैं और जावास्क्रिप्ट घटनाओं का उपयोग का उपयोग कर जावा कोड कॉल करने के लिए webView.addJavascriptInterface(....etc)

पूर्ण कहानी: - http://developer.android.com/guide/webapps/webview.html#BindingJavaScript

1

आप WebViewClient वर्ग पर onUnhandledKeyEvent() समारोह overrid उपयोग कर सकते हैं। मेरे लिए पूरी तरह से काम करता है।

onUnhandledKeyEvent

@Override 
public void onUnhandledKeyEvent(WebView view, KeyEvent event) { 
     return; 
} 

whenever a user presses any key on the keyboard, this event will get fire. 
Please let me know if that's works for you?