java - 使用 InAppBrowser 和微调器加载页面后无法输入输入字段

标签 java android cordova spinner inappbrowser

我有一个非常有趣的问题。我在我的一个 Android 应用程序中使用了 inAppBrowser 和微调器。 Spinner 是用 ProgressDialog 实现的。这里的问题是,当我尝试通过 inAppBrowser 打开网页时,加载微调器在页面开始加载后开始加载,然后在页面加载完成后关闭,当我点击该页面的输入字段并尝试输入字母或数字,它只是停留在所谓的“锁定”状态。如果我输入一些我看不到的东西,光标就会一直闪烁。

为了让这更奇怪,我可以输入特殊字符。如果我点击页面周围的任何其他地方,然后再次点击相同的输入字段,那么它就可以工作了。另一种情况是当我将应用程序置于暂停状态然后恢复它时,输入字段可以正常工作。

此问题仅出现在 Android 5.0.1 及更早版本的平台上。

inAppBrowser java 文件可以在 Github 中找到 InAppBrowser java file .

我的微调器实现如下:

spinner = new ProgressDialog(cordova.getActivity());
spinner.setIndeterminate(false);
spinner.setProgressStyle(ProgressDialog.STYLE_SPINNER);
spinner.setCancelable(false);
spinner.setMessage(cordova.getActivity().getText(R.string.spinner_loading));
spinner.setTitle("");

我用以下方式显示/隐藏微调器:

@Override
public void onPageStarted(WebView view, String url,  Bitmap favicon) {
    super.onPageStarted(view, url, favicon);
    //InAppBrowser default code....

    try {
        JSONObject obj = new JSONObject();
        obj.put("type", LOAD_START_EVENT);
        obj.put("url", newloc);

        sendUpdate(obj, true);

    } catch (JSONException ex) {
        Log.d(LOG_TAG, "Should never happen");
    }

    spinner.show();
}

public void onPageFinished(WebView view, String url) {
    super.onPageFinished(view, url);
    try {
        JSONObject obj = new JSONObject();
        obj.put("type", LOAD_STOP_EVENT);
        obj.put("url", url);

        sendUpdate(obj, true);

    } catch (JSONException ex) {
         Log.d(LOG_TAG, "Should never happen");
    }

    spinner.hide();
}

这可能是什么问题?如有任何提示和建议,我们将不胜感激。

最佳答案

现在我可以解决这个问题了。问题是该特定页面输入字段的焦点。出于某种原因,一旦页面加载完成,它就没有将焦点放在自己身上。

尝试使用 editText.clearFocus() 修复 inAppBrowser 的 inAppBrowser.java 文件中的问题,然后使用 editText.requestFocus() 没有成功一点帮助都没有。但对我有用的是以下解决方案。

由于 inAppBrowser 有一个名为 executeScript() 的方法,因此我能够将一些 Javascript 代码注入(inject)到出现此问题的特定输入字段中。因此下面的代码起到了作用:

var ref = cordova.InAppBrowser.open('http://apache.org', '_blank',  location=yes');
ref.addEventListener('loadstop', function() {
    ref.executeScript({code: "$('#element').blur(); $('#element').focus();"});
});

该代码的作用是首先清除该特定元素的焦点,然后再次关注同一元素。

无论版本如何,这都适用于任何平台。

关于java - 使用 InAppBrowser 和微调器加载页面后无法输入输入字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42161636/

相关文章:

java - 在 ListView 中动态生成具有可绘制形状的 TextView

java - Android ProGuard 返回行号

android - GCM(Google 云消息传递)- 我可以使用相同的注册 ID 注册多个设备吗?

java - 从 Play 商店下载后,Google map 无法使用

java - Hibernate多态性(扩展父类)

java - 如何去除 JFrame 边框让图像触及边缘

java - 如何仅在用户登录时执行此代码

cordova - 使用 Cordova/Phonegap 构建的应用程序启动后卡在黑屏上,安装后首次加载

android - 在 Android 2.3 上使用 JQuery Mobile 的 Phonegap 中缺少转换

android - 如何为手机间隙创建 android native 库/扩展