2016-04-29 13 views
1

Ich habe this Leitfaden für die Bindung von JavaScript-Code zu Android-Code, der ordnungsgemäß funktioniert (eine Toast Nachricht wird ausgelöst, aus JavaScript-Code und zeigt double Typ Ausgabe von JavaScript-Code). Mein Problem ist, dass ich die Ausgabe in anderen Teilen des Codes nicht verwenden kann. Zum Beispiel korrekte Ausgänge 10, 20, 30, ... sind, aber was ich in einem anderen Teil des Codes zuzugreifen, ist 0, 10, 20, 30, ... .Hier wird Teile meines Code bezogen werden:kann nicht auf Javascript-Ausgabe in Android-Code richtig zugreifen

public class myFragment extends Fragment { 
    int globalVar; 
    . 
    . 
    . 
    //some android code 
    . 
    . 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.menu_item_show: 
      loadNew(); 
      Toast.makeText(getActivity(), "globalVar " + String.valueOf(globalVar), Toast.LENGTH_SHORT).show(); 
    //after clicking menu item, I receive a double output from javascript, 
    //but first output is zero!!! 
     . 
    . 
    . 
    //some android code 
    . 
    . 
public class WebAppInterface { 
    Context mContext; 

    /** Instantiate the interface and set the context */ 
    WebAppInterface(Context c) { 
     mContext = c; 
    } 
    @JavascriptInterface 
    public void showToast(double toast) { 
     Toast.makeText(mContext, String.valueOf(toast), Toast.LENGTH_SHORT).show(); 
     //In this part of code, results are correct 
     globalVar = (int) (toast); 
    } 
} 

jedes Mal wenn ich auf den Menüpunkt klicken, wird eine neue Seite geladen und Javascript Code gibt ein neues Ergebnis.

Ich denke, dass das Problem durch den Zugriff auf Variablen aus inneren Klassen entstanden ist oder vielleicht gibt es einen anderen Grund. Vielen Dank im Voraus.

+0

Hallo, wie sieht Ihre 'showAndroidToast()' Methode aus? Da Sie es im onLoad-Ereignis haben, wird es bei jedem Laden der Seite ausgeführt. Vielleicht sollten Sie lieber einen Button und einen onClick Event Handler auf Ihrem Dokument haben wie '
' – ishmaelMakitla

+0

Vielen Dank für Ihre Antwort @ishmaelMakitla. Innerhalb von showAndroidToast() definiere ich eine doppelte Variable und rufe dann Android.showToast (myVar) auf. Die Verwendung einer Schaltfläche wird keine Änderungen vornehmen, da ich in 'public void showToast (double toast)' korrekte Ergebnisse erhalte. –

+0

Ich sehe, Sie sagen, Sie können nicht die Ausgabe (doppelte Werte) in anderen Teilen von Ihnen Code verwenden - wo ist das "ein anderer Teil des Codes", der falsche Zahlen zu haben scheint "0, 10, 20, 30, ..." ? Ich vermute, dies ist in der Menü-Item-Click-Funktion, aber nur um zu bestätigen, damit ich etwas vorschlagen kann ... – ishmaelMakitla

Antwort

0

// Java End //

erstellen Auf der Webview Akivität

webView.getSettings().setJavaScriptEnabled(true); 
webView.addJavascriptInterface(new JavaScriptInterface(this), "JSInterface"); 

Danach

//Class to be injected in Web page 
    public class JavaScriptInterface implements JavascriptCallback { 
     Context mContext; 

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

     /** 
     * Show a toast from the web page 
     */ 
     @JavascriptInterface 
     public void loadComplete() { 
      pd.dismiss(); 
     } 
// this code will use to show toast from javascript 
     @JavascriptInterface 
     public void showToast(String toast) { 
      Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); 
     } 
     // this code will use to call a java code from javascript with some parameters. 
     @JavascriptInterface 
     public void getTimeandDistance(String time, String distance) { 

      disTime = "Time: " + time + " | Distance: " + distance; 
      runOnUiThread(new Thread(new Runnable() { 
       public void run() { 
        try { 
         someTextview.setText(disTime); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
       } 
      })); 

     } 
    } 

// Java Script End //

function someFunction(data) { 

     var distance = data.route.distance; 

     var time = data.route.formattedTime; 

     // In this way we call a java code from javascript with some parameters. 

     JSInterface.getTimeandDistance(time + "", distance + ""); 

} 

und nur Toast zu zeigen, können Sie auf diese Weise tun

// write anywhere in your javaScript code 
JSInterface.showToast("Show Toast"); 
+0

Danke für deine Antwort @ Hamza Mehmood. JavascriptCallback kann nicht aufgelöst werden. –

0

Mein Vorschlag wäre für Sie einige „listener“ oder „callback“ zu verwenden (mit der als zweites Argument zu WebAppInterface), die in benachrichtigt werden showAndroidToast Methode. Ich habe ein Gist of such a listener erstellt, fügen Sie es einfach in Ihr Paket und aktualisieren Sie die Paketnamen. Dann Sie Ihre innere Klasse aktualisieren (WebAppInterface) das zweite Argument in seinem Konstruktor zu übernehmen:

public class WebAppInterface { 
    Context mContext; 
    DummyToastListener toastListener; 
    /** Instantiate the interface and set the context */ 
    WebAppInterface(Context c, DummyToastListener listener) { 
     mContext = c; 
     toastListener = listener; 
    } 
    @JavascriptInterface 
    public void showToast(double toast) { 
     Toast.makeText(mContext, String.valueOf(toast), Toast.LENGTH_SHORT).show(); 
     toastListener.onToastValue(toast); 
    } 
} 

Sie dann myFragment Klasse aktualisieren DummyToastListener wie folgt umzusetzen:

public class myFragment extends Fragment implements DummyToastListener { 

    //some where in your code, initializing the WebAppInterface 
    //the second argument is also a 'this' because the fragment implements the interface 
    webView.addJavascriptInterface(new WebAppInterface(this, this), "Android"); 
    //implementing the method of the interface DummyToastListener 
    @Override 
    public void onToastValue(double value){ 
    //got the new value from Javascript function, do whatever... 
    Toast.makeText(getActivity(), String.valueOf(value), Toast.LENGTH_LONG).show(); 
    } 

} 

Mit diesem Ansatz wird der Wert von der Javascript-Funktion wird immer in der Callback-Methode frisch sein.

Verwandte Themen