2012-05-06 16 views
24

Ich versuche, eine Aktivität von einer Javascript-Schnittstelle in meinem Webview zu starten. Das Beispiel zeigt einen Toast. Wie kann ich eine Klasse anstatt eines Toasts anrufen?mit JavaScript in android webview

public class JavaScriptInterface { 
Context mContext; 

/** Instantiate the interface and set the context */ 
JavaScriptInterface(Context c) { 
    mContext = c; 
} 

/** Show a toast from the web page */ 
public void showToast(String toast) { 
    Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); 
} 
} 

dies für die HTML-Seite.

<input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" /> 

<script type="text/javascript"> 
function showAndroidToast(toast) { 
    Android.showToast(toast); 
} 

+3

Ich bin nicht erfahren genug, um zu antworten, aber Sie haben das gelesen: http://developer.android.com/guide/webapps/webview.html#UsingJavaScript – JaredMcAteer

+0

Ich habe das schon getan. – Common

+0

Ok ich habe gerade nirgendwo gesehen, wo Sie das Javascript in der Webansicht aktiviert und obwohl es relevant war. – JaredMcAteer

Antwort

60

Sie müssen zuerst die JavaScriptInterface auf webview registrieren. JavaScriptInterFace kann eine innere Klasse sein, wie unten gezeigt. Diese Klasse wird eine Funktion haben, die Sie von einer HTML-Seite aufrufen können (via javaScript) und innerhalb dieser Funktion können Sie Code schreiben, um die Aktivität zu ändern. Hier

ist die Arbeitslösung für Sie:

public class JavascriptInterfaceActivity extends Activity { 
    /** Called when the activity is first created. */ 


    WebView wv; 

    JavaScriptInterface JSInterface; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     wv = (WebView)findViewById(R.id.webView1); 

     wv.getSettings().setJavaScriptEnabled(true); 
     // register class containing methods to be exposed to JavaScript 

     JSInterface = new JavaScriptInterface(this); 
     wv.addJavascriptInterface(JSInterface, "JSInterface"); 

     wv.loadUrl("file:///android_asset/myPage.html"); 

    } 


    public class JavaScriptInterface { 
     Context mContext; 

     /** Instantiate the interface and set the context */ 
     JavaScriptInterface(Context c) { 
      mContext = c; 
     } 

     @android.webkit.JavascriptInterface 
     public void changeActivity() 
     { 
      Intent i = new Intent(JavascriptInterfaceActivity.this, nextActivity.class); 
      startActivity(i); 
      finish(); 
     } 
    } 
} 

Hier ist die HTML-Seite

<html> 
<head> 
<script type="text/javascript"> 
function displaymessage() 
{ 
JSInterface.changeActivity(); 
} 
</script> 
</head> 

<body> 
<form> 
<input type="button" value="Click me!" onclick="displaymessage()" /> 
</form> 
</body> 
</html> 

Hope this helps ...

+0

Danke mein Freund. es hat mir fast geholfen, mein Problem zu lösen. – Common

+0

@Common Ich sollte den obigen HTML-Code in separate HTML-Datei nehmen? –

+4

Dies ist nützlich, um Android-Funktionen von einem Javascript zu nennen, aber es gibt eine Möglichkeit, JavaScript-Funktionen von Android-Code aufzurufen? –

18

Sie müssen auch die @android hinzufügen .webkit.JavascriptInterface Anmerkung über Ihre changeActivity Methode in Ihrem Android-Code, sollten Sie auf Android 4.2 oder höher ausführen. Siehe hierzu link für mehr.

+0

Diese Zusatzinformation zu der obigen Antwort ist sehr nützlich! – David

+0

Sie sind Genie – ashutosh

+0

Es half mir wirklich – vm345