Cordova inAppBrowser 在 Java Android 中隐藏/显示

Cordova inAppBrowser Hide / Show in Java Android

我正在使用 Cordova 和 Android

的 inAppBrowser 插件

https://github.com/apache/cordova-plugin-inappbrowser

我正在尝试控制 Java 文件

中 Android 的硬件后退按钮

InAppBrowserDialog.java

public void onBackPressed() {
    if (this.inAppBrowser == null) {
        this.dismiss();
    } else {
        if (this.inAppBrowser.hardwareBack() && this.inAppBrowser.canGoBack()) {
            // this.inAppBrowser.goBack();
        } else {
            // this.inAppBrowser.closeDialog();
        }
    }
}

我不希望它“返回”或“关闭对话框”,我希望它“隐藏”,就像您可以在 Cordova 上调用它一样Java脚本端

https://github.com/apache/cordova-plugin-inappbrowser#inappbrowserhide

ref.hide();

隐藏是理想的选择,因此我可以在不加载整个页面的情况下调用 .show,如果我只是关闭它就会发生这种情况。

我正在寻找 Java 命令,例如

 this.inAppBrowser.hide();

可是我好像找不到。


更新

所以链接到 Codrova .hide Java脚本的 Java 代码在这里

https://github.com/apache/cordova-plugin-inappbrowser/blob/8bdbd18d1619e25cf8bdedadf6448ef40b21ea7c/src/android/InAppBrowser.java#L329-L341

        else if (action.equals("hide")) {
        this.cordova.getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (dialog != null && !cordova.getActivity().isFinishing()) {
                    dialog.hide();
                }
            }
        });
        PluginResult pluginResult = new PluginResult(PluginResult.Status.OK);
        pluginResult.setKeepCallback(true);
        this.callbackContext.sendPluginResult(pluginResult);
    }

我只是不知道如何从 Java 后退按钮函数调用这个 Java 函数。


更新

JensV 提供的工作版本

所以我编辑了InAppBrowserDialog.java

我加了

import org.apache.cordova.CordovaArgs;
import org.json.JSONArray;

并在里面添加了

public class InAppBrowserDialog extends Dialog {

以下

public void hideDialog() {
    CordovaArgs args = new CordovaArgs(new JSONArray());
    try {
        this.inAppBrowser.execute("hide", args, new FakeCallbackContext());
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

public void showDialog() {
    CordovaArgs args = new CordovaArgs(new JSONArray());
    try {
        this.inAppBrowser.execute("show", args, new FakeCallbackContext());
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

然后我在同一目录中创建了一个新的 java 文件,名为

FakeCallbackContext.java

并在里面放了下面的代码

package org.apache.cordova.inappbrowser;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.PluginResult;

class FakeCallbackContext extends CallbackContext {

  public FakeCallbackContext() {
    super(null, null);
    
  }

  @Override
  public void sendPluginResult(PluginResult pluginResult) {
    // Do not send an actual result to the webview
    // Perhaps just log the result
  }
}

我查看了源代码并确认该插件没有暴露 dialog 成员,这会阻止您直接与其交互。一种方法是通过反射来公开它,但这对我来说似乎很老套。

你可以做的是通过在插件上调用execute来模拟直接在Java中调用JS函数。为了不出现任何意外问题,我们需要提供一个 CordovaArgsCallbackContext 实例。 CordovaArgs 很容易伪造,但 CallbackContext 不应与实际的 webview 交互并尝试调用 JS。所以我创建了一个包装器,它在调用时什么都不做:

package your.package.name

import org.apache.cordova.CallbackContext;
import org.apache.cordova.PluginResult;

class FakeCallbackContext extends CallbackContext {

    public FakeCallbackContext() {
        super(null, null);
    }

    @Override
    public void sendPluginResult(PluginResult pluginResult) {
        // Do not send an actual result to the webview
        // Perhaps just log the result
    }
}

然后为了从您的代码中调用方法,您可以按如下方式调用 execute。我假设 this.inAppBrowserInAppBrowser:

的一个实例
// ...

import org.apache.cordova.CordovaArgs;
import org.json.JSONArray;

// ...


void hideDialog() {
    CordovaArgs args = new CordovaArgs(new JSONArray());
    this.inAppBrowser.execute("hide", args, new FakeCallbackContext());
}

void showDialog() {
    CordovaArgs args = new CordovaArgs(new JSONArray());
    this.inAppBrowser.execute("show", args, new FakeCallbackContext());
}

更新
添加了必要的导入。作为参考,我指的是 Intellij / Android Studio 的“快速修复”功能。您可以按 Alt+Enter (Mac: + ) 源代码中的错误(以红色突出显示)应用建议来修复该错误。这包括但不限于丢失的导入。