使用InAppBrowser和spinner加载加载页面后,无法输入输入字段

时间:2017-02-10 14:20:40

标签: java android cordova spinner inappbrowser

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

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

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

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

我的微调器实现如下:

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();
}

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

2 个答案:

答案 0 :(得分:5)

现在我能够解决问题。问题是该特定页面输入字段的焦点。由于某些原因,一旦页面加载完毕,它就没有关注自己。

尝试使用inAppBrowser.java然后editText.clearFocus()在inAppBrowser的editText.requestFocus()文件中解决问题根本没有帮助。但对我有用的是解决方案。

由于inAppBrowser有一个名为executeScript()的方法,我能够将一些Javascript代码注入到具有此问题的特定输入字段。因此,遵循以下代码可以解决问题:

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

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

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

答案 1 :(得分:1)

如果有人仍然像我这样得到此问题,请尝试将InAppBrowser插件更新到最新版本(1.7.2)。

ionic cordova plugin rm cordova-plugin-inappbrowser --save
ionic cordova plugin add cordova-plugin-inappbrowser --save

版本1.7.2具有此fix

我正在使用Ionic(v3)。