2017-07-20 2 views
0

Ich versuche, einen Wert aus einer benutzerdefinierten Javascript-Datei zu übergeben, die ich nach dem Laden einer URL in eine Webansicht eingefügt habe.Wert kann nicht von Javascript-Datei an Android gesendet werden Aktivität

Ich habe diese reference überprüft, aber es funktioniert nicht, wenn ich eine Website abgesehen von einer lokalen index.html Datei lade.

Hier ist meine Aktivitätscode, wo ich die Javacript Schnittstelle erstellt haben:

public class MainActivity extends AppCompatActivity { 

    public static String URL = "https://www.ornativa.com"; 
    private WebView mWebView; 
    private RelativeLayout mLoader; 
    private Toolbar mToolbar; 
    JSInterface JSI = new JSInterface(this); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     createWebView(); 
    } 

    @SuppressLint("SetJavaScriptEnabled") 
    public void createWebView(){ 
     mWebView = (WebView)findViewById(
       R.id.webView); 
     mToolbar = (Toolbar)findViewById(R.id.toolbar); 

     mToolbar.setTitle(getResources().getString(R.string.app_name)+" | "+getResources().getString(R.string.app_name_hindi)); 
     mLoader = (RelativeLayout) findViewById(R.id.loader); 
     // Add javascript support to the webview 
     mWebView.getSettings().setJavaScriptEnabled(true); 
     // Enable pinch zoom controls on webview 
     mWebView.getSettings().setBuiltInZoomControls(false); 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
      if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE)) 
      { WebView.setWebContentsDebuggingEnabled(true); } 
     } 
     // Add a WebViewClient 
     mWebView.setWebViewClient(new WebViewClient() { 

      @Override 
      public void onPageFinished(WebView view, String url) { 

       // Inject CSS when page is done loading 
       injectCSS(); 
       injectJS(); 
       super.onPageFinished(view, url); 
       mLoader.setVisibility(View.GONE); 
      } 
     }); 

     mWebView.addJavascriptInterface(JSI, "Android"); 

     // Load a webpage 
     mWebView.loadUrl(URL); 
    } 

    public void injectCSS(){ 
     try { 
      InputStream inputStream = getAssets().open("styles.css"); 
      byte[] buffer = new byte[inputStream.available()]; 
      inputStream.read(buffer); 
      inputStream.close(); 
      String encoded = Base64.encodeToString(buffer, Base64.NO_WRAP); 
      mWebView.loadUrl("javascript:(function() {" + 
        "var parent = document.getElementsByTagName('head').item(0);" + 
        "var style = document.createElement('style');" + 
        "style.type = 'text/css';" + 
        // Tell the browser to BASE64-decode the string into your script !!! 
        "style.innerHTML = window.atob('" + encoded + "');" + 
        "parent.appendChild(style)" + 
        "})()"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    private void injectJS() { 
     try { 
      InputStream inputStream = getAssets().open("script.js"); 
      byte[] buffer = new byte[inputStream.available()]; 
      inputStream.read(buffer); 
      inputStream.close(); 
      String encoded = Base64.encodeToString(buffer, Base64.NO_WRAP); 
      mWebView.loadUrl("javascript:(function() {" + 
        "var parent = document.getElementsByTagName('head').item(0);" + 
        "var script = document.createElement('script');" + 
        "script.type = 'text/javascript';" + 
        "script.innerHTML = window.atob('" + encoded + "');" + 
        "parent.appendChild(script)" + 
        "})()"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onBackPressed() { 
      AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      builder.setCancelable(false); 
      builder.setIcon(R.mipmap.ic_launcher); 
      builder.setTitle(R.string.app_name); 
      builder.setMessage("Do you really want to Exit?"); 
      builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        //if user pressed "yes", then he is allowed to exit from application 
        finish(); 
       } 
      }); 
      builder.setNegativeButton("No", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        //if user select "No", just cancel this dialog and continue with app 
        dialog.cancel(); 
       } 
      }); 
      AlertDialog alert = builder.create(); 
      alert.show(); 

    } 
    public class JSInterface { 

     private Context mContext; 

     public JSInterface(Context c) { 
      mContext = c; 

     } 
     @JavascriptInterface 
     public void showToast(String message) { 
      Toast.makeText(mContext, message, Toast.LENGTH_LONG).show(); 
     } 

    } 


} 

Und das ist meine script.js Datei:

document.getElementById("aadhaarNo").type= 'tel'; 
var myElem = document.getElementById('actionMessages'); 
Android.showToast("Hello World!"); 
if (myElem === null) { 
    console.log('does not exist'); 
} 
else{ 
    if (myElem.classList.contains('success')){ 
     console.log('success'); 
    } 
} 

ich die Funktion aus dem Skript aufrufen versuche Datei, um den Wert an den Toast zu senden, aber der Toast wird nicht angezeigt.

Antwort

1

Ändern Sie in der Klasse JSInterface "Kontext" in "Aktivität". Überprüfen Sie den unten angegebenen Code.

public class JSInterface { 

     private Activity mContext; 

     public JSInterface(Activity c) { 
      mContext = c; 

     } 

     @JavascriptInterface 
     public void showToast(String message) { 
      Toast.makeText(mContext, message, Toast.LENGTH_LONG).show(); 
     } 

    } 
Verwandte Themen