【问题标题】:Binding JavaScript code to Android code将 JavaScript 代码绑定到 Android 代码
【发布时间】:2011-05-07 18:57:58
【问题描述】:

我试图从 javascript 中调用 java 中的方法,但是当我在模拟器中运行应用程序时不会发生这种情况,当假设在 java 中调用该方法时应用程序会停止。
这里是java代码:

import android.os.Bundle;
import android.webkit.WebView;
import com.phonegap.*;

public class App extends DroidGap {
    WebView webView; 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        webView = new WebView(this); 
        webView.addJavascriptInterface(new message(), "Show");
        super.loadUrl("file:///android_asset/www/index.html");
    }

    class message {
        String msg() {
            return "Hello World!!";
        }
    }
}


这是javascript:

<script type="text/javascript">
{
    alert("Start");
    alert(Show.msg());
    alert("End");    
}
</script>

它显示第一个警报,但之后什么都没有,有人可以帮忙吗?

【问题讨论】:

    标签: javascript android cordova


    【解决方案1】:

    您的问题是您一半使用PhoneGap,一半没有使用。您正在从 PhoneGap 中创建一个单独的 WebView 类。您添加“显示”的 WebView 类永远不会被使用。而是作为 super (DroidGap) 成员的 WebView 类。

    你应该做两件事之一。

    • 使用PhoneGap的插件结构(见例子here
    • 根本不使用PhoneGap,并且有一个看起来更像下面的类:

      public class act extends Activity {
         WebView webView; 
          @Override
          public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              webView = new WebView(this); 
              webView.getSettings().setJavaScriptEnabled(true);
      
              // Set JS alert() hook
              webView.setWebChromeClient(new WebChromeClient() {
                  public boolean onJsAlert(WebView view, String url, String message, JsResult result) 
                  {
                      return false;
                  }
                  });       
      
              webView.loadUrl("file:///android_asset/www/index.html");
      
              // Add JS libraries
              webView.addJavascriptInterface(new message(), "Show");
          }
      
          class message {
              public String msg() {
                  return "Hello World!!";
              }
          }
      }
      

    注意msg方法需要public

    【讨论】:

    • 谢谢,我明白你的意思了......那么,我用 tcp\ip 客户端替换消息类并让它与台式计算机上的服务器通信是否有意义?我打算为此使用wifi,并且我已经在android设备上使用telnet应用程序测试了连接,通信工作正常。
    • 我相信是的。您应该能够将任何您想要的 Android 原生代码放入消息类中。
    【解决方案2】:

    为什么不直接使用 AlertDialog?

    private void showDialog(int title, String message) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle(title);
        builder.setMessage(message);
        builder.setPositiveButton(R.string.ok_button, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
            }
        });
        builder.show();
    }
    

    【讨论】:

    • 我只使用示例中的 alert(String) 方法来检查 java 和 javascript 之间的交互是否正常,在我正在编写的应用程序中,我想调用不同的方法,每个执行不同的动作并返回不同的类型。
    猜你喜欢
    • 2019-10-31
    • 2020-07-20
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    相关资源
    最近更新 更多