当前位置: 首页 > 知识库问答 >
问题:

WebView中OnClick(HTML中的按钮)的活动中的触发器方法

贺波
2023-03-14

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

我已经设置好了所有的东西,它正在工作,但是在活动中调用一个方法(从JSInterface中调用)只有在我将活动方法设置为static时才有效,当它设置为static时,我不能从static方法(从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类i调用的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。实例max.mybai W/WebView:java。Throwable:在线程“JavaBridge”上调用了WebView方法。必须在同一线程上调用所有WebView方法。(预期的活套活套(main,tid1){76eeef3}在活套(JavaBridge,tid335){6f228eb}上调用,FYI主活套是android上的活套(main,tid1){76eeef3})。网络工具包。网络视图。android上的checkThread(WebView.java:2334)。网络工具包。网络视图。com上的loadUrl(WebView.java:927)。实例马克斯·米拜。姆拜维尤。在com上加载html(MbaiWebView.java:94)。实例马克斯·米拜。MbaiTextActivity$override。在com上测试(MbaiTextActivity.java:180)。实例马克斯·米拜。MbaiTextActivity$override。访问com上的$dispatch(MbaiTextActivity.java)。实例马克斯·米拜。MbaiTextActivity。在com上测试(MbaiTextActivity.java:0)。实例马克斯·米拜。JSWebAppInterface。org上的sendData(JSWebAppInterface.java:24)。铬。基础SystemMessageHandler。组织上的NativeDorUnloponce(本机方法)。铬。基础SystemMessageHandler。android上的handleMessage(SystemMessageHandler.java:39)。操作系统。处理程序。android上的dispatchMessage(Handler.java:102)。操作系统。活套。android上的loop(Looper.java:154)。操作系统。手杖线。run(HandlerThread.java:61)04-18 08:01:23.249 17751-17891/com。实例最大mybai W/系统。错误:java。RuntimeException:java。Throwable:在线程“JavaBridge”上调用了WebView方法。必须在同一线程上调用所有WebView方法。(预期活套活套(主,tid 1){76eeef3}调用活套(JavaBridge,tid 335){6f228eb},FYI主活套为活套(主,tid 1){76eeef3})04-18 08:01:23.249 17751-17891/com。实例最大mybai W/系统。呃:在android上。网络工具包。网络视图。checkThread(WebView.java:2344)04-18 08:01:23.250 17751-17891/com。实例最大mybai W/系统。呃:在android上。网络工具包。网络视图。loadUrl(WebView.java:927)04-18 08:01:23.250 17751-17891/com。实例最大mybai W/系统。错误:在com上。实例马克斯·米拜。姆拜维尤。loadHTML(MbaiWebView.java:94)04-18 08:01:23.250 17751-17891/com。实例最大mybai W/系统。错误:在com上。实例马克斯·米拜。MbaiTextActivity$override。test(MbaiTextActivity.java:180)04-18 08:01:23.250 17751-17891/com。实例最大mybai W/系统。错误:在com上。实例马克斯·米拜。MbaiTextActivity$override。访问$dispatch(MbaiTextActivity.java)04-18 08:01:23.250 17751-17891/com。实例最大mybai W/系统。错误:在com上。实例马克斯·米拜。MbaiTextActivity。测试(MbaiTextActivity.java:0)04-18 08:01:23.250 17751-17891/com。实例最大mybai W/系统。错误:在com上。实例马克斯·米拜。JSWebAppInterface。sendData(JSWebAppInterface.java:24)04-18 08:01:23.250 17751-17891/com。实例最大mybai W/系统。错误:在org。铬。基础SystemMessageHandler。NativedorUnloponce(本地方法)04-18 08:01:23.250 17751-17891/com。实例最大mybai W/系统。错误:在org。铬。基础SystemMessageHandler。handleMessage(SystemMessageHandler.java:39)04-18 08:01:23.250 17751-17891/com。实例最大mybai W/系统。呃:在android上。操作系统。处理程序。dispatchMessage(Handler.java:102)04-18 08:01:23.250 17751-17891/com。实例最大mybai W/系统。呃:在android上。操作系统。活套。loop(Looper.java:154)04-18 08:01:23.250 17751-17891/com。实例最大mybai W/系统。呃:在android上。操作系统。手杖线。run(HandlerThread.java:61)04-18 08:01:23.250 17751-17891/com。实例最大mybai W/系统。错误:由:java引起。Throwable:在线程“JavaBridge”上调用了WebView方法。必须在同一线程上调用所有WebView方法。(预期活套活套(主,tid 1){76eeef3}调用活套(JavaBridge,tid 335){6f228eb},FYI主活套为活套(主,tid 1){76eeef3})04-18 08:01:23.250 17751-17891/com。实例最大mybai W/系统。呃:在android上。网络工具包。网络视图。checkThread(WebView.java:2334)04-18 08:01:23.250 17751-17891/com。实例最大mybai W/系统。呃:。。。11更多04-18 08:01:23.255 17751-17751/com。实例max.mybai I/chromium:[INFO:CONSOLE(19)]“未捕获错误:在方法调用期间引发了Java异常”,来源:file:///android_asset/books/der_brax/texts/derBrax_part1.html(19)04-18 08:01:23.29117751-17751/com。实例max.mybai W/art:尝试删除非JNI本地引用,转储线程04-18 08:01:23.432 17751-17751/com。实例max.mybai W/art:尝试删除非JNI本地引用,转储线程

共有1个答案

阎坚成
2023-03-14

像这样重写代码:

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");
 类似资料:
  • > 按常规声明代码 Page language=“vb”autoeventwireup=“false”masterpageFile=“~/site.master”codeBehind=“RetailCompetition.aspx.vb”inherits=“company.applications.production.ui.RetailCompetition” 事件

  • 问题内容: 我对javascript不太熟悉,但是我认为这是实现我的目标的最佳方法。如果没有,请纠正我。 我最后有一个许可证文本2按钮。所有这些都是用HTML编写的,因为许可证中有一些链接。现在,我希望当用户单击中的“确定”按钮时,这会触发一些我可以在Java中抓取的JavaScript或侦听器以触发应用程序中的前进。(“取消”按钮的作用相反,但是如果我知道一种方法,我可以做另一种。) 这会给某人

  • 这是我的问题: 我想在一个活动中实现两个按钮。一个是计算BMI,另一个是检查时间。我希望用户能在同一个活动中看到两个按钮,这也取决于他们想做什么。(这些功能不是同时工作的,而是分开的。另外,我在这两个活动中都实现了返回主页的按钮。) 在Android模拟器中,消息来自“应用程序继续停止”。 以下是主要活动。java文件: 谢谢! 这些消息是我按下导致应用程序停止的按钮后的stacktrace:

  • 我已经创建了一个类,它扩展了。在该类中,当我按下一个按钮时,我想更改一个按钮的背景,该按钮被放置在主活动中。 我试图创建一个内部类来访问Main Active对象,但我得到的是这个错误: 尝试在空对象引用上调用虚拟方法android.content.pm.Application ationInfoandroid.content.Context.getApplication ationInfo()

  • 我用Webview创建了一个应用程序,需要自动按下按钮 返回null。 任何帮助都将不胜感激!

  • 我正在为Android在Eclipse中编写一个应用程序。该应用程序不断与Web服务器中的内容进行通信。在服务器中,我有一个带有另一个按钮的html文件。我希望当我按下Android应用程序中的按钮时,html文件中的按钮被自动单击...是否可能。请建议... 我看到下面的代码(jquery): 谢啦