javascript - WebView中来自OnClick(来自HTML中的按钮)的Activity中的触发方法

标签 javascript android html webview onclick

我有一个显示本地HTML文件的WebView。在该HTML中,我有一个硬编码的JavaScript函数。该按钮还位于该HTML文件中的按钮上的Onclick函数传递给JavaScriptInterface的字符串。从那里我想用那两个传递的字符串在我的活动中调用一个方法。这可能吗?

我已经设置好一切,并且可以正常工作,但是仅当我将Activity方法设置为static且将其设置为static时,才能在Activity中(从JSInterface内)调用方法(仅在JSInterface中有效),从静态方法内部(由JSInterface触发)。

这是我的代码,希望您能为我提供帮助:

public class JSWebAppInterface {
Context mContext;

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

@JavascriptInterface
public void sendData(String action, String filename){
    MbaiTextActivity.getDecision(action, filename);
}


}

public class MbaiTextActivity extends Activity {

private static final String TAG = "_TEXTACTIVITY";

MbaiWebView mwv;

RelativeLayout containerForWebViews;

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.text_activity);

    containerForWebViews = (RelativeLayout) findViewById(R.id.webView_container);

    mwv = new MbaiWebView(this);
    mwv.setWebViewClient(new MbaiWebViewClient(this));
    mwv.setOnStatusListener(onWebViewListener);
    mwv.addJavascriptInterface(new JSWebAppInterface(this), "android");
    mwv.findViewById(R.id.webView_container);

    mwv.loadHTML(textsPath + storyparts.get(currentPosition).getFilename());
    containerForWebViews.addView(mwv);

private MbaiWebView.OnStatusListener onWebViewListener = new MbaiWebView.OnStatusListener()

static void getDecision(String action, String filename){
    // just for test purpose
    System.out.println("Aus der TextAct.: " + filename + " " + action);
    // do soemthing
}


}

在JSInterface类中,我在Activity中调用了test():

    public void test(String one, String two){
    System.out.println("Aus der Test: " + one + " " + two);
    mwv.loadHTML(textsPath + "derBrax_part5.html");
}


04-18 08:01:23.248 17751-17891/com.example.max.mybai I/System.out: Aus der Test: Springen derBrax_part1.html


04月18日08:01:23.249 17751-17891 / com.example.max.mybai W / WebView:java.lang.Throwable:在线程“ JavaBridge”上调用了WebView方法。所有WebView方法必须在同一线程上调用。 (在Looper(JavaBridge,tid 335){6f228eb}上调用了预期的Looper Looper(main,tid 1){76eeef3},FYI main Looper是Looper(main,tid 1){76eeef3})
                                                                    在android.webkit.WebView.checkThread(WebView.java:2334)
                                                                    在android.webkit.WebView.loadUrl(WebView.java:927)
                                                                    在com.example.max.mybai.MbaiWebView.loadHTML(MbaiWebView.java:94)
                                                                    在com.example.max.mybai.MbaiTextActivity $ override.test(MbaiTextActivity.java:180)
                                                                    在com.example.max.mybai.MbaiTextActivity $ override.access $ dispatch(MbaiTextActivity.java)
                                                                    在com.example.max.mybai.MbaiTextActivity.test(MbaiTextActivity.java:0)
                                                                    在com.example.max.mybai.JSWebAppInterface.sendData(JSWebAppInterface.java:24)
                                                                    在org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(本机方法)
                                                                    在org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:39)
                                                                    在android.os.Handler.dispatchMessage(Handler.java:102)
                                                                    在android.os.Looper.loop(Looper.java:154)
                                                                    在android.os.HandlerThread.run(HandlerThread.java:61)
04月18日08:01:23.249 17751-17891 / com.example.max.mybai W / System.err:java.lang.RuntimeException:java.lang.Throwable:在线程“ JavaBridge”上调用了WebView方法。所有WebView方法必须在同一线程上调用。 (在Looper(JavaBridge,tid 335){6f228eb}上调用了预期的Looper Looper(main,tid 1){76eeef3},FYI main Looper是Looper(main,tid 1){76eeef3})
04-18 08:01:23.249 17751-17891 / com.example.max.mybai W / System.err:位于android.webkit.WebView.checkThread(WebView.java:2344)
04-18 08:01:23.250 17751-17891 / com.example.max.mybai W / System.err:位于android.webkit.WebView.loadUrl(WebView.java:927)
04-18 08:01:23.250 17751-17891 / com.example.max.mybai W / System.err:at com.example.max.mybai.MbaiWebView.loadHTML(MbaiWebView.java:94)
04-18 08:01:23.250 17751-17891 / com.example.max.mybai W / System.err:at com.example.max.mybai.MbaiTextActivity $ override.test(MbaiTextActivity.java:180)
04-18 08:01:23.250 17751-17891 / com.example.max.mybai W / System.err:at com.example.max.mybai.MbaiTextActivity $ override.access $ dispatch(MbaiTextActivity.java)
04-18 08:01:23.250 17751-17891 / com.example.max.mybai W / System.err:at com.example.max.mybai.MbaiTextActivity.test(MbaiTextActivity.java:0)
04-18 08:01:23.250 17751-17891 / com.example.max.mybai W / System.err:at com.example.max.mybai.JSWebAppInterface.sendData(JSWebAppInterface.java:24)
04-18 08:01:23.250 17751-17891 / com.example.max.mybai W / System.err:位于org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(本机方法)
04-18 08:01:23.250 17751-17891 / com.example.max.mybai W / System.err:位于org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:39)
04-18 08:01:23.250 17751-17891 / com.example.max.mybai W / System.err:at android.os.Handler.dispatchMessage(Handler.java:102)
04-18 08:01:23.250 17751-17891 / com.example.max.mybai W / System.err:位于android.os.Looper.loop(Looper.java:154)
04-18 08:01:23.250 17751-17891 / com.example.max.mybai W / System.err:位于android.os.HandlerThread.run(HandlerThread.java:61)
04-18 08:01:23.250 17751-17891 / com.example.max.mybai W / System.err:由以下原因引起:java.lang.Throwable:在线程“ JavaBridge”上调用了WebView方法。所有WebView方法必须在同一线程上调用。 (在Looper(JavaBridge,tid 335){6f228eb}上调用了预期的Looper Looper(main,tid 1){76eeef3},FYI main Looper是Looper(main,tid 1){76eeef3})
04-18 08:01:23.250 17751-17891 / com.example.max.mybai W / System.err:位于android.webkit.WebView.checkThread(WebView.java:2334)
04-18 08:01:23.250 17751-17891 / com.example.max.mybai W / System.err:...还有11个
04-18 08:01:23.255 17751-17751 / com.example.max.mybai I / chromium:[INFO:CONSOLE(19)]“未捕获的错误:在方法调用期间引发了Java异常”,源:file:// /android_asset/books/der_brax/texts/derBrax_part1.html(19)
04-18 08:01:23.291 17751-17751 / com.example.max.mybai W / art:尝试删除非JNI本地引用,转储线程
04-18 08:01:23.432 17751-17751 / com.example.max.mybai W / art:尝试删除非JNI本地引用,转储线程

最佳答案

像这样重写代码:

public void getDecision(String action, String filename){
    // just for test purpose
    System.out.println("Aus der TextAct.: " + filename + " " + action);
    // do soemthing
}

public class JSWebAppInterface {
    private final MbaiTextActivity act;

    /** Instantiate the interface and set the context */
    public JSWebAppInterface(MbaiTextActivity act) {
        this.act = act;
    }

    @JavascriptInterface
    public void sendData(String action, String filename){

        //EDIT:
        act.runOnUiThread(new Runnable() {

            @Override
            public void run () {

                 act.getDecision(action, filename);
            }
        });

    }
}

//in onCreate
mwv.addJavascriptInterface(new JSWebAppInterface(this), "android");

关于javascript - WebView中来自OnClick(来自HTML中的按钮)的Activity中的触发方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43475426/

相关文章:

html - 表格边框不适用于导出到 excel

javascript - 尽管网站上有非 SVG 元素,如何在 SVG 上的鼠标光标旁边显示工具提示?

javascript - 如何点击同一个元素触发不同的功能?

javascript - 如何获取按钮调用的JavaScript方法?

javascript - 使用 Javascript 发布到 url 但保留在页面上

java - 服务器发送的事件 Android

android - AlertDialog 被空 onClick 关闭

android - react-native-fcm 上的错误处理

html - 定义列表格式未按预期工作

javascript - MDL 组件不适用于 React