0

我正在使用我的应用程序使用Payfort sdk进行在线支付,一切都完全集成并且工作正常,在付款时,我可以毫无顾虑地使用普通卡进行支付,但使用3-D 安全卡我必须输入一个用于验证的密码,因此,带有密码字段的(由 Visa 验证的)webview 会自动打开,其中包含所需的详细信息。

这里的问题是,当点击密码字段时,它会获得焦点,但键盘没有打开以写入密码,打开的 webview 不是我的应用程序的视图,我无法控制它,而是关闭它。

我什至不知道如何弄清楚它现在已打开,因为我没有收到任何相应的回调。

在此处输入图像描述

通过 Payfort 代码导航,我发现他们发布了AlertDialog一个布局,其中包含一个webView要显示的验证页面链接:

 private Dialog showVerificationDialog(Context context, String url, VerificationDialogDismissListener onDialogListener) {
    LayoutInflater layoutInflater = LayoutInflater.from(context); // context here is MyActivity context
    View view = layoutInflater.inflate(R.layout.web_dialog, null);
    DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();

    // just to display the Dialog at 80% of the screen
    view.setMinimumHeight((int) (displayMetrics.heightPixels * 0.8f));
    view.setMinimumWidth((int) (displayMetrics.widthPixels * 0.8f));

    // setting the webView
    WebView webView = (WebView) view.findViewById(R.id.webView);
    webView.setWebViewClient(new WebViewClient());
    webView.getSettings().setJavaScriptEnabled(true);
    webView.loadUrl(url);

    // setting the Dialog
    AlertDialog.Builder builder = new AlertDialog.Builder(context)
            .setView(view)
            .setOnCancelListener(onDialogListener);
    if (Build.VERSION.SDK_INT >= 17) {
        builder.setOnDismissListener(onDialogListener);
    }
    Dialog dialog = builder.create();
    dialog.show();

    return dialog;
}

此对话框包含用于验证过程的 webView,因此存在问题,但我找不到该代码的任何问题,任何一切都直接链接。

4

1 回答 1

0

终于发现了这个问题,它是Payfort布局中的一个 Bug,它有一个web 视图R.layout.web_dialog,可以通过showVerificationDialog()payfort Start类中的方法访问。

问题是布局R.layout.web_dialog不能获得焦点,因为布局只包含webView并且没有其他东西可以将焦点放在布局上,以便它能够启动 KB (看看这里),并且作为在上一个问题链接中声明它是一个众所周知的Android Bug。

因此,为了解决该问题,我必须在对方法进行更改后直接复制并粘贴整个 Start 类并从新复制的版本中访问 payfort showVerificationDialog()。关于有助于克服该问题的更改,请查看此答案(在我的情况下不起作用),或者您可以提供一个webView包含虚拟和隐藏的新布局,EditText我的答案中所述问题链接,然后膨胀您的新布局,而不是 Payfort 在showVerificationDialog()方法启动的默认布局:

private Dialog showVerificationDialog(Context context, String url, PayfortStarter.VerificationDialogDismissListener onDialogListener) {
    isVerifying = true;
    isOTP = true;
    LayoutInflater layoutInflater = LayoutInflater.from(context);
    View view = layoutInflater.inflate(R.layout.webview_dialog, null);
    DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
    view.setMinimumHeight((int) (displayMetrics.heightPixels * WEB_VIEW_SCREEN_PERCENTS));
    view.setMinimumWidth((int) (displayMetrics.widthPixels * WEB_VIEW_SCREEN_PERCENTS));

    WebView webView = (WebView) view.findViewById(R.id.webView);
    webView.setWebViewClient(new WebViewClient());
    webView.getSettings().setJavaScriptEnabled(true);
    webView.loadUrl(url);

    AlertDialog.Builder builder = new AlertDialog.Builder(context)
            .setView(view)
            .setOnCancelListener(onDialogListener);
    if (Build.VERSION.SDK_INT >= 17) {
        builder.setOnDismissListener(onDialogListener);
    }
    Dialog dialog = builder.create();
    dialog.show();

    return dialog;
}

webview_dialog.xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:id="@+id/kb_holder"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:inputType="text"
        android:maxLines="1"
        android:visibility="gone" />

    <WebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</FrameLayout>
于 2017-10-15T08:55:37.837 回答