我用我的应用程序使用Payfort进行在线支付,所有东西都是完全集成和工作正常的,在支付时,我可以使用普通卡进行支付,而不用担心,但是使用3-D安全卡,我必须输入一个密码进行验证,因此,带有密码字段的(由Visa验证的) webview将自动打开,并提供所需的详细信息。
这里的问题是,当点击密码字段时,它会得到焦点,但键盘不会打开来写入密码,打开的when视图不是我的应用程序的视图,我无法控制它,而是关闭它。
我甚至不知道如何知道它现在是打开的,因为我没有收到任何相应的回调。

在浏览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,因此存在问题,但我找不到该代码的任何问题--所有内容都是直接链接的。
发布于 2017-10-15 08:55:37
最后发现了这个问题,它是Payfort布局中的一个Bug,名为R.layout.web_dialog,它有一个Bug视图可由PayFort开始类中的方法showVerificationDialog()访问。
问题是布局R.layout.web_dialog不能接受焦点,因为布局只包含webView,没有其他东西可以将焦点赋予布局,以便它能够启动KB (看看这里),正如前面的问题链接所述,它是众所周知的Android。
因此,为了解决这个问题,我必须复制并粘贴整个Start类,并在对showVerificationDialog()方法进行更改后直接从新复制的版本中访问payfort。关于有助于克服该问题的更改,请查看这个答案 (在我的示例中不起作用),或者您可以提供一个新的webView布局,其中包含一个虚拟的EditText &隐藏的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>https://stackoverflow.com/questions/46273173
复制相似问题