अद्यतन
किटकैट सीधे जावास्क्रिप्ट लागू के लिए एक सार्वजनिक विधि कहा: evaluateJavascript()
पुराने API के लिए, आप नीचे दिए की तरह एक समाधान की कोशिश कर सकते हैं, लेकिन अगर मैं यह करने के लिए किया था फिर मैं देखने के लिए चाहते हैं केवल एक संगतता विधि बनाने पर कि किटकैट उपर्युक्त विधि और पुराने उपकरणों पर उपयोग करता है, एक आंतरिक निजी विधि पर ड्रिल करने के लिए प्रतिबिंब का उपयोग करता है: BrowserFrame.stringByEvaluatingJavaScriptFromString()
फिर आप बिना किसी सौदे के जावास्क्रिप्ट को कॉल कर सकते हैं adUrl और स्क्रिप्ट में "javascript: "
जोड़ना।
ओल्ड उत्तर
आलोक कुलकर्णी द्वारा अनुरोध के रूप में, मैं एक संभावित समाधान, मैं इस के लिए के बारे में सोचा का एक मोटा जानकारी देंगे। मैंने वास्तव में कोशिश नहीं की है लेकिन सिद्धांत रूप में इसे काम करना चाहिए। यह कोड किसी न किसी होने वाला है और सिर्फ एक उदाहरण के रूप में काम करने के लिए है।
loadUrl() के माध्यम से कॉल भेजने के बजाय, आप अपने जावास्क्रिप्ट कॉल कतारबद्ध करते हैं और फिर जावास्क्रिप्ट उन्हें नीचे खींचते हैं। कुछ चीजें जैसे:
private final Object LOCK = new Object();
private StringBuilder mPendingJS;
public void execJS(String js) {
synchronized(LOCK) {
if (mPendingJS == null) {
mPendingJS = new StringBuilder();
mPendingJS.append("javascript: ");
}
mPendingJS
.append(js)
.append("; ");
}
}
loadUrl() को कॉल करने के बजाय उस विधि को कॉल करें। (इस सरल बनाने के लिए मैंने एक सिंक्रनाइज़ ब्लॉक का उपयोग किया, लेकिन यह एक अलग मार्ग के लिए बेहतर हो सकता है। चूंकि जावास्क्रिप्ट अपने धागे पर चलता है, इसलिए इसे थ्रेड को किसी अन्य तरीके से सुरक्षित करने की आवश्यकता होगी)।
public class JSInterface {
public String getPendingJS() {
synchronized(LOCK) {
String pendingCommands = mPendingJS.toString();
mPendingJS.setLength(0);
mPendingJS.append("javascript: ");
return pendingCommands;
}
}
}
लंबित आदेशों के साथ एक स्ट्रिंग रिटर्न और उन्हें तो वे फिर से वापस आ नहीं मिलता साफ करता है कि:
फिर अपने WebView इस तरह एक अंतरफलक होगा।
आप इस तरह WebView में जोड़ने होगा:
mWebView.addJavascriptInterface(new JSInterface(), "JSInterface");
फिर अपने जावास्क्रिप्ट में आप जो में लंबित आदेशों फ्लश करने के लिए कुछ अंतराल सेट होगा। प्रत्येक अंतराल पर यह JSInterface.getPendingJS()
पर कॉल करेगा जो सभी लंबित आदेशों का एक स्ट्रिंग वापस करेगा और फिर आप उन्हें निष्पादित कर सकते हैं।
आप यह देखने के लिए execJS विधि में एक चेक जोड़कर इसे और सुधार सकते हैं यह देखने के लिए कि WebView में कोई संपादन टेक्स्ट मौजूद है या नहीं। यदि कोई है, तो आप इस क्यूइंग विधि का उपयोग करेंगे, लेकिन यदि फोकस में कोई नहीं था तो आप केवल loadUrl() को सामान्य की तरह कॉल कर सकते हैं। इस तरह यह वास्तव में केवल इस कामकाज का उपयोग करता है जब इसे वास्तव में आवश्यकता होती है।
loadUrl() के बाद इसे कॉल करने का प्रयास करें; ((इनपुट मोड मैनेजर) getSystemService (Context.INPUT_METHOD_SERVICE))। टॉगल सॉफ़्ट इनपुट (इनपुट मोड मैनेजर .HOW_FORCED, इनपुट मोड मैनेजर। HIDE_IMPLICIT_ONLY); – zeitue
हम्मम्म, बहुत करीब। कुंजीपटल बंद हो जाता है और फिर इसके साथ फिर से वास्तविक फिर से खोलता है। बहुत अजीब लग रहा है;)। हालांकि मैं इस विचार के साथ अधिक प्रयोग कर सकता हूं। – cottonBallPaws
समस्या का एक और हिस्सा यह है कि clearTextEntry() उस संपादन टेक्स्ट को भी हटा देता है जिस पर कीबोर्ड केंद्रित है। – cottonBallPaws