Cordova inAppBrowser 在 Java Android 中隐藏/显示
Cordova inAppBrowser Hide / Show in Java Android
我正在使用 Cordova 和 Android
的 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 代码在这里
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函数。为了不出现任何意外问题,我们需要提供一个 CordovaArgs
和 CallbackContext
实例。 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.inAppBrowser
是 InAppBrowser
:
的一个实例
// ...
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: ⌥ + ↵ ) 源代码中的错误(以红色突出显示)应用建议来修复该错误。这包括但不限于丢失的导入。
我正在使用 Cordova 和 Android
的 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 代码在这里
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函数。为了不出现任何意外问题,我们需要提供一个 CordovaArgs
和 CallbackContext
实例。 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.inAppBrowser
是 InAppBrowser
:
// ...
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: ⌥ + ↵ ) 源代码中的错误(以红色突出显示)应用建议来修复该错误。这包括但不限于丢失的导入。