【问题标题】:Cordova inAppBrowser Hide / Show in Java AndroidCordova inAppBrowser 在 Java Android 中隐藏/显示
【发布时间】:2021-01-01 23:55:40
【问题描述】:

我正在使用 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();
        }
    }
}

我不希望它“goBack”或“closeDialog”,我希望它“隐藏”,就像你可以在 Cordova Javascript 端调用它一样

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

ref.hide();

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

我正在寻找一个 Java 命令,例如

 this.inAppBrowser.hide();

但我似乎找不到它。


更新

所以链接到 Codrova .hide Javascript 的 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
  }
}

【问题讨论】:

    标签: java android cordova phonegap


    【解决方案1】:

    我查看了源代码并确认该插件没有公开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: + )红色)应用建议来修复该错误。这包括但不限于缺少导入。

    【讨论】:

    • 感谢您的回复。我对Java很陌生,我在哪里放置这段代码?我将您的“隐藏”调用放在 onBackPressed Java 函数中,因此当用户点击后退按钮时会调用它。我尝试将 FakeCallbackContext 类都放在 onBackPressed 内部并尝试在它外面。两次尝试都返回编译错误,无法找到符号类 CallbackContext。有我需要导入的库吗?你建议我把你的代码放在哪里?
    • FakeCallbackContext 可以放在它自己的文件中。这是一门课程,与其他课程没有什么不同。
    • @nomaam 您缺少这些类的导入。 Android Studio 应该能够自动修复这个问题。
    • @nomaam 用导入和解释更新了答案
    • @nomaam 啊,我的错。应该是super(null, null)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    相关资源
    最近更新 更多