दिलचस्प पोस्ट
एंड्रॉइड मार्कर के लिए खींचें और ड्रॉप कैसे लागू होता है? नक्शे के सी + + नक्शे के माध्यम से कैसे लूप करें? IOS 5 में UITabBarItem में पाठ का रंग कैसे बदल सकता है क्या याहू ने अचानक अपने वित्त डाउनलोड एपीआई को समाप्त कर दिया है? दृश्य सी ++ का उपयोग करके कोड के पीछे असेंबली को कैसे देखें? अनुवर्ती: रंगों के बीच एक सटीक "दूरी" ढूंढना जब static_cast, dynamic_cast, const_cast और reinterpret_cast को इस्तेमाल किया जाना चाहिए? लॉगिन सिस्टम के रूप में ओपन आईडी का उपयोग कैसे करें बुलियन सरणी के सभी मान सही हैं या नहीं, यह जांचने का सबसे शानदार तरीका क्या है? कोको में iTunes गीत शीर्षक स्क्रोलिंग मैं एक डीजेango टेम्पलेट में मेरे कस्टम टेम्पलेट फ़िल्टर में एकाधिक तर्क कैसे जोड़ूं? mysql-python स्थापना की समस्याएं (मैक ओएस एक्स शेर पर) यानी 9 सीमा त्रिज्या मैं BigQuery में TABLE_QUERY () फ़ंक्शन का उपयोग कैसे करूं? रेडियोबटन – एक कस्टम ड्रॉएबल का उपयोग कैसे करें?

वेबव्यू में एंड्रॉइड कॉलिंग जावास्क्रिप्ट फंक्शन

मैं android webview अंदर चलने वाले एक html पेज में बैठे कुछ javascript कार्यों को कॉल करने की कोशिश कर रहा हूं। एंड्रॉइड ऐप से कोड नीचे करने की कोशिश करता है, यह काफी सरल है, टेस्ट मेसेज के साथ एक javascript फंक्शन को कॉल करें, जो टेस्ट के जरिए टेस्ट संदेश प्रदर्शित करने वाले एंड्रॉइड ऐप में जावा फ़ंक्शन को वापस कॉल करता है।

javascript समारोह ऐसा दिखता है:

 function testEcho(message){ window.JSInterface.doEchoTest(message); } 

वेबव्यू से, मैंने javascript को बिना किसी नसीब से निम्नलिखित तरीके से फोन करने की कोशिश की:

 myWebView.loadUrl("javascript:testEcho(Hello World!)"); mWebView.loadUrl("javascript:(function () { " + "testEcho(Hello World!);" + "})()"); 

मैंने WebView पर javascript सक्षम किया है

 myWebView.getSettings().setJavaScriptEnabled(true); // register class containing methods to be exposed to JavaScript myWebView.addJavascriptInterface(myJSInterface, "JSInterface"); 

और Java क्लास को सुनता है

 public class JSInterface{ private WebView mAppView; public JSInterface (WebView appView) { this.mAppView = appView; } public void doEchoTest(String echo){ Toast toast = Toast.makeText(mAppView.getContext(), echo, Toast.LENGTH_SHORT); toast.show(); } } 

मैंने बहुत समय व्यतीत किया है कि यह देखने के लिए कि मैं गलत क्या कर रहा हूं। इस दृष्टिकोण का उपयोग करने वाले सभी उदाहरण मैंने पाया है क्या कोई यहाँ कुछ गलत है?

संपादित करें: कई अन्य बाहरी javascript फ़ाइलें संदर्भित और html में उपयोग की जा रही हैं, क्या वे समस्या हो सकती हैं?

वेब के समाधान से एकत्रित समाधान "वेबव्यू में एंड्रॉइड कॉलिंग जावास्क्रिप्ट फंक्शन"

मुझे पता चला कि समस्या क्या थी: testEcho () पैरामीटर में उद्धरण चिह्नों को लापता। इस तरह मुझे काम करने के लिए कॉल मिला है:

 myWebView.loadUrl("javascript:testEcho('Hello World!')"); 

KitKat से आगे की तरह जावास्क्रिप्ट फ़ंक्शंस कॉल करने के लिए loadUrl के बजाय जावास्क्रिप्ट विधि का मूल्यांकन करें

  if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) { webView.evaluateJavascript("enable();", null); } else { webView.loadUrl("javascript:enable();"); } 
 public void run(final String scriptSrc) { webView.post(new Runnable() { @Override public void run() { webView.loadUrl("javascript:" + scriptSrc); } }); } 

हां आपके पास सिंटैक्स त्रुटि है यदि आप अपने जावास्क्रिप्ट त्रुटियों और प्रिंटिंग स्टेटमेंट को अपने onConsoleMessage(ConsoleMessage cm) में प्राप्त करना चाहते हैं, तो आपको अपने onConsoleMessage(ConsoleMessage cm) में onConsoleMessage(ConsoleMessage cm) पद्धति को लागू करना होगा। यह वेब कंसोल (निरीक्षण तत्व) जैसी पूर्ण ढेर के निशान देता है। यहां विधि है

 public boolean onConsoleMessage(ConsoleMessage cm) { Log.d("ShowMote", cm.message() + " -- From line " + cm.lineNumber() + " of " + cm.sourceId() ); return true; } 

क्रियान्वयन के बाद आप अपने लॉगकाट पर अपनी जावास्क्रिप्ट त्रुटियों और प्रिंट स्टेटमेंट ( console.log ) प्राप्त करेंगे।

मैंने JavaScript विधियों को कॉल करने के लिए एक अच्छा आवरण बनाया है; यह लॉग में जावास्क्रिप्ट त्रुटियों को भी दिखाता है:

 private void callJavaScript(String methodName, Object...params){ StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("javascript:try{"); stringBuilder.append(methodName); stringBuilder.append("("); for (int i = 0; i < params.length; i++) { Object param = params[i]; if(param instanceof String){ stringBuilder.append("'"); stringBuilder.append(param); stringBuilder.append("'"); } if(i < params.length - 1){ stringBuilder.append(","); } } stringBuilder.append(")}catch(error){Android.onError(error.message);}"); webView.loadUrl(stringBuilder.toString()); } 

आपको यह भी जोड़ना होगा:

 private class WebViewInterface{ @JavascriptInterface public void onError(String error){ throw new Error(error); } } 

और यह इंटरफ़ेस आपके वेबव्यू पर जोड़ें:

 webView.getSettings().setJavaScriptEnabled(true); webView.addJavascriptInterface(new WebViewInterface(), "AndroidErrorReporter"); 

@Ilya_Gazman जवाब का संशोधन

  private void callJavaScript(WebView view, String methodName, Object...params){ StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("javascript:try{"); stringBuilder.append(methodName); stringBuilder.append("("); String separator = ""; for (Object param : params) { stringBuilder.append(separator); separator = ","; if(param instanceof String){ stringBuilder.append("'"); } stringBuilder.append(param); if(param instanceof String){ stringBuilder.append("'"); } } stringBuilder.append(")}catch(error){console.error(error.message);}"); final String call = stringBuilder.toString(); Log.i(TAG, "callJavaScript: call="+call); view.loadUrl(call); } 

सही ढंग से जे एस कॉलों को बनाएगा जैसे

 callJavaScript(mBrowser, "alert", "abc", "def"); //javascript:try{alert('abc','def')}catch(error){console.error(error.message);} callJavaScript(mBrowser, "alert", 1, true, "abc"); //javascript:try{alert(1,true,'abc')}catch(error){console.error(error.message);} 

ध्यान दें कि ऑब्जेक्ट्स को सही ढंग से पारित नहीं किया जाएगा – लेकिन आप तर्क के रूप में पास करने से पहले उन्हें क्रमबद्ध कर सकते हैं।

इसके अलावा मैंने जहां बदल दिया है, वहां बदल दिया है, मैंने इसे कंसोल लॉग पर डाला है, जिसे इनके द्वारा सुनी जा सकती है:

  webView.setWebChromeClient(new CustomWebChromeClient()); 

और ग्राहक

 class CustomWebChromeClient extends WebChromeClient { private static final String TAG = "CustomWebChromeClient"; @Override public boolean onConsoleMessage(ConsoleMessage cm) { Log.d(TAG, String.format("%s @ %d: %s", cm.message(), cm.lineNumber(), cm.sourceId())); return true; } }