2010-12-27 12 views
7

मैं अपने एंड्रॉइड ऐप के लिए वेबव्यू का उपयोग करता हूं। मुझे एक समस्या मिली और मदद के लिए समाधान का अनुरोध किया।एचटीएमएल टेक्स्ट-इनपुट में कीबोर्ड गायब हो जाता है जब WebView कॉल 'loadUrl' फिर से

HTML पृष्ठ में एक टेक्स्टफील्ड है। जब यह 'फोकस' हो जाता है और उसके बाद मैं जावा कोड में

  mWebView.setFocusableInTouchMode(true); 

फोन ताकि एंड्रॉयड नरम कुंजीपटल पॉप अप होगा मुझ में कुंजी बताने के लिए।

समस्या

है मैं बहु धागा का उपयोग कर की जरूरत है जावा में कुछ प्रक्रियाओं के लिए और जावास्क्रिप्ट समारोह निष्पादित करने के लिए

  mWebView.loadUrl(strJSCall); 
कॉलबैक के रूप में

फोन है, लेकिन कुंजीपटल छिपा हुआ हो जाता है!

जिस तरह से मैं कोशिश करता हूं वह कुंजीपटल को फिर से दिखाने के लिए मजबूर करना है। लेकिन जब 'loadUrl' कहा जाता है तो कीबोर्ड हमेशा कैसे दिखा सकता है? क्या कोई भी एक ही मुद्दे को पूरा करता है और इसे हल करता है?

निष्ठा से, जूनियर

+0

मेरे पास एंड्रॉइड 3.0 (मोटोरोला ज़ूम) पर समान समस्या है। एंड्रॉइड 2.x के साथ अन्य उपकरणों पर यह सामान्य रूप से काम करता है। क्या आपको एक समाधान मिला? –

उत्तर

2

मैं एक ही समस्या है और पूरी तरह से अभी तक यह हल नहीं किया है।

मैं webView.loadUrl बुला के बाद दिखाने के लिए कीबोर्ड के लिए मजबूर करने में सक्षम है, सबसे पहले आपको पता लगाना चाहते हैं कुंजीपटल दिखाया जा रहा है की जरूरत है, मैं इस How to check visibility of software keyboard in Android?

का एक संशोधित संस्करण का इस्तेमाल किया तो

फोन
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.showSoftInput(webview, InputMethodManager.SHOW_IMPLICIT); 

लेकिन अगर मुझे पसंद है तो आपको प्रत्येक कुंजी प्रेस के बाद वेबव्यू में जावास्क्रिप्ट के साथ संवाद करने की आवश्यकता है, तो यह दृष्टिकोण कुंजीपटल को झिलमिलाहट करने का कारण बनता है क्योंकि यह ऊपर और नीचे एनिमेट करने की कोशिश करता है।
यह आपके द्वारा टाइप किए जाने वाले तेज़ के आधार पर कुछ इनपुट भी याद करता है।

5

loadUrl के साथ समस्या यह है कि यह यूआई थ्रेड में बाधा डालता है और अभी भी इनपुट विधि बंद कर देगा। ऐसा करने का एकमात्र ठोस तरीका यह है कि कर्सर वेबव्यू पर क्या है, और अपने वेबव्यू पर डिफ़ॉल्ट लोड यूआरएल व्यवहार को ओवरराइड करें।

अपने कस्टम वेबव्यू के अंदर:

@Override 
public void loadUrl(String url) { 
    HitTestResult testResult = this.getHitTestResult(); 
    if (url.startsWith("javascript:)" && testResult != null && testResult.getType() == HitTestResult.EDIT_TEXT_TYPE) 
    { 
      //Don't do anything right now, we have an active cursor on the EDIT TEXT 
      //This should be Input Method Independent 
    } 
    else 
    { 
     super.loadUrl(url); 
    } 
} 

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

फिर, अगर आपको टाइप करने के दौरान अपडेट करने के लिए कुछ चाहिए तो आपको जावा के लिए जावास्क्रिप्ट के साथ संवाद करने का एक और तरीका मिलना होगा जो यूआई थ्रेड को अवरुद्ध नहीं करता है। यह एक कठिन समस्या है जिसे मैंने अभी तक ठीक से हल नहीं किया है।

+0

आपके उत्तर के लिए धन्यवाद। मैंने इस एपीआई को ओवरराइड किया लेकिन वर्चुअल कीबोर्ड को छिपाने के लिए फंक्शन कॉल से बचने के लिए "प्रतिबिंब" तरीका का उपयोग किया। –

+0

@ जेआर। क्या आप समझ सकते हैं कि आपने इसे ठीक करने के लिए वास्तव में क्या किया है? धन्यवाद। – Piotr

1

एंड्रॉइड में, वेबव्यू से जावास्क्रिप्ट निष्पादित करना एक तरफा है: WebView.loadUrl ("जावास्क्रिप्ट: उप (1,1)") को कॉल करना; आप सीधे वापसी मूल्य नहीं प्राप्त कर सकते हैं। How to get return value from javascript in webview of android?

लेकिन ज्यादातर मामलों में, हम एक सिंक विधि के बजाय async तरह से की जरूरत है:

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

मैं दो समाधान की कोशिश की है: 1. जावा पी/वी चर async से एक सिंक विधि रैप करने के लिए, पर समाधान की तरह दिखता है:, How to get return value from javascript in webview of android?

समाधान पूरी तरह से काम नहीं कर रहा है क्योंकि प्रतीक्षा विधि जावास्क्रिप्ट और जावास्क्रिप्ट इंटरफेस के निष्पादन को अवरुद्ध कर देगा। इसलिए यदि हम यूआई थ्रेड में जेएस विधि का परिणाम प्राप्त करना चाहते हैं। यह मुमकिन नहीं है।

  1. stringByEvaluatingJavaScriptFromString के मूल इंटरफेस प्राप्त करने के लिए जावा प्रतिबिंब का उपयोग करें। Exist stringByEvaluatingJavaScriptFromString for Android

वर्क्स बहुत अच्छी तरह से, केवल एक चीज देखभाल करने के लिए, जब पेज लोड समाप्त प्रारंभिक प्रतिबिंब विधि करने के लिए है की जरूरत है। मैंने WebView के कन्स्ट्रक्टर के अंदर प्रतिबिंब प्रारंभ करने की कोशिश की, लेकिन असफल रहा। मुझे लगता है कि निर्माता एसिंक विधि है।

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