有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

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

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

这里有什么问题?如有任何提示和建议,将不胜感激


共 (2) 个答案

  1. # 1 楼答案

    如果有人仍然像我一样遇到这个问题,请尝试将iApp浏览器插件更新到最新版本(1.7.2)

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

    版本1.7.2有这样的fix

    我用的是爱奥尼亚(v3)

  2. # 2 楼答案

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

    试图通过使用editText.clearFocus()editText.requestFocus()来修复InApp Browser的inAppBrowser.java文件中的问题根本没有帮助。但对我有效的是以下解决方案

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

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

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

    这项技术可以在任何平台上运行,而不管版本是什么