gpt4 book ai didi

java - Cordova inAppBrowser 在 Java Android 中隐藏/显示

转载 作者:行者123 更新时间:2023-12-05 06:07:14 24 4
gpt4 key购买 nike

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

最佳答案

我查看了源代码并确认该插件没有公开 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 的“快速修复”功能。您可以在源代码中的错误(突出显示红色)应用建议来修复该错误。这包括但不限于丢失的导入。

关于java - Cordova inAppBrowser 在 Java Android 中隐藏/显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65534821/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com