2012-10-24 28 views
7

वेबव्यू में जब मैं webview.loadUrl() के माध्यम से एक जावास्क्रिप्ट निष्पादित करता हूं, तो यह दिखाई देने पर सॉफ्टकीबोर्ड गायब हो जाता है। जब मैं HTML टेक्स्ट फ़ील्ड में कुछ टेक्स्ट टाइप करने का प्रयास करता हूं, तो सॉफ्टकीबोर्ड गायब हो जाता है (यदि जावास्क्रिप्ट निष्पादित किया जाता है) और मैं सभी टेक्स्ट टाइप करने में असमर्थ हूं।जब मैं जावास्क्रिप्ट निष्पादित करता हूं तो एंड्रॉइड वेबव्यू पर sotfkeyboard गायब हो जाता है

टेक्स्ट फ़ील्ड फोकस नहीं खोता है, इसलिए प्रॉम्प्ट टेक्स्ट फ़ील्ड पर अभी भी है, लेकिन सॉफ्टकीबोर्ड नीचे चला जाता है।

क्या कोई मुझे बता सकता है कि इसे कैसे ठीक किया जाए?

+0

Maby एक गंदा समाधान, आप दिखाई दे सकता है (यह गूगल) "शक्ति" के लिए कीबोर्ड की कोशिश या कीबोर्ड राज्य की जांच कर सकता है, और अगर राज्य है "दिखाई नहीं दे रहा है" आप कीबोर्ड को दृश्यमान सेट कर सकते हैं। पता नहीं है कि यह काम करता है, सिर्फ एक विचार है। – Mdlc

उत्तर

1

यह एक अपेक्षित व्यवहार है: WebView.loadUrl() पर कॉल करके आप मूल रूप से पृष्ठ को पुनः लोड कर रहे हैं, इसलिए सॉफ्ट कीबोर्ड को खारिज कर दिया जाता है।

वैकल्पिक रूप से, आप यह निर्धारित करने का प्रयास कर सकते हैं कि सॉफ्ट कीबोर्ड दिखाया गया है और जब तक यह छिपा हुआ नहीं है तो जेएस निष्पादन में देरी हो रही है। मुलायम कीबोर्ड स्थिति की जांच करने के लिए एक सामान्य विधि के लिए, How to check visibility of software keyboard in Android?

5

ऐसा करने का सबसे आसान तरीका प्लगइन या जावास्क्रिप्ट इंटरफेस में जावास्क्रिप्ट कॉल संग्रहीत करना है और इसे अपने जावास्क्रिप्ट पक्ष में निष्पादित करने की विधि दोहराना है। इस तरह loadUrl कभी नहीं कहा जाता है।

कुछ की तरह:

StringBuilder sb = null; 
private final Object LOCK = new Object(); 
public void sendJavascript(String js){ 
    synchronized(LOCK) { 
    if (sb == null){ 
    sb = new StringBuilder(); 
    sb.append("javascript:"); 
    } 
    sb.append(js):  
    } 
} 

फिर एक javascriptInterface का उपयोग कर:

private class JsInterface { 


@JavascriptInterface 
    public String getJavascript(){ 
     synchronized(LOCK) { 
     String javascriptToRun = sb.toString(); 
     sb = new StringBuilder(); 
     sb.append("javascript:"); 
     return javascriptToRun; 
     } 
     } 
} 

अपने वेब दृश्य करने के लिए अपने जावास्क्रिप्ट इंटरफ़ेस जोड़ें:

JsInterface jsInterface = new JavascriptInterface(); 
webview.addJavascriptInterface(jsInterface, "JsInterface"); 

और अपने जावास्क्रिप्ट कोड पर एक समय अंतराल सेट संग्रहित फ़ंक्शन को पुनर्प्राप्त करने के लिए।

संपादित

मैं सिर्फ this answer पाया, यह पता चलता मेरा एक बड़ी समस्या है, तरीकों सिंक्रनाइज़ नहीं कर रहे हैं। मतलब जब आप getJavascript() पर कॉल करते हैं तो हमारे चर sb अभी तक पढ़ने के लिए तैयार नहीं हो सकते हैं। मैंने उपर्युक्त स्रोत में प्रासंगिक बिट जोड़ा है।

का प्रयोग करें ताले या अपने कोड अविश्वसनीय हो जाएगा