2016-04-29 3 views
1

Я использовал this руководство по привязке кода JavaScript к Android-коду, который работает правильно (сообщение Toast запускается из кода javascript и показывает double тип вывода кода javascript). Моя проблема в том, что я не могу использовать вывод в других частях кода. Например, правильные выходы 10, 20, 30, ..., но то, что я достигаю в другой части кода 0, 10, 20, 30, ... .Здесь связана части моего кода:не может получить выход javascript в коде Android правильно

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); 
    } 
} 

каждый раз я нажимаю на пункт меню, новая страница загружается и Javascript код дает новый результат.

<body onLoad="showAndroidToast();"> 

Я думаю, что проблема возникает из-за доступа к переменным из внутренних классов или, может быть, есть еще одна причина. Спасибо заранее.

+0

Привет, как выглядит ваш метод 'showAndroidToast()'? Поскольку у вас есть это в событии onLoad, он будет выполняться каждый раз при загрузке страницы. Поэтому, возможно, вам лучше иметь кнопку и обработчик события onClick на вашем документе, например '
' – ishmaelMakitla

+0

Спасибо за ваш ответ @ishmaelMakitla. Внутри showAndroidToast() я определяю double vaiable, а затем вызываю Android.showToast (myVar). Использование кнопки не вносит никаких изменений, потому что в 'public void showToast (двойной тост)' я получаю правильные результаты. –

+0

Я вижу, вы говорите, что вы не можете использовать выходные данные (двойные значения) в других частях кода - где это «другая часть кода», которая, кажется, имеет неправильные номера «0, 10, 20, 30, ...» ? Я подозреваю, что это функция Menu-Item-Click, но для подтверждения, поэтому я могу что-то предложить ... – ishmaelMakitla

ответ

0

// Java End //

О создании в WebView Acivity

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

После этого

//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 Конец //

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 + ""); 

} 

и просто, чтобы показать тост вы можете сделать это путь

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

Спасибо за ваш ответ @ Хамза Мехмуд. JavascriptCallback не может быть разрешен. –

0

Мое предложение было бы для вас использовать некоторые «listener» или «callback» (передать в качестве второго аргумента WebAppInterface), который будет уведомлено в showAndroidToast способ. Я создал Gist of such a listener, просто добавьте его в свой пакет и обновите имена пакетов. Затем вы обновляете свой внутренний класс (WebAppInterface), чтобы взять второй аргумент в конструктор:

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); 
    } 
} 

Затем обновить myFragment класс для реализации DummyToastListener так:

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(); 
    } 

} 

При таком подходе значение из функции Javascript всегда будет свежей в методе обратного вызова onToastValue.

Смежные вопросы