独自のWebViewを作成し、WebChromeClientおよびWebViewClientオブジェクトを設定しました。このWebViewを起動すると、HTMLフォームフィールドはタッチすると反応します(カーソルが表示されます)が、選択されず、ソフトキーボードも起動しません。トラックボールを使用してフォームを選択して押すと、キーボードが表示されます。
myWebview.requestFocusFromTouch()
を この回答 のように呼び出そうとしましたが、falseを返し、助けにはなりません。
http://code.google.com/p/Android/issues/detail?id=7189
他が明確でない場合の修正はここにあります。
webview.requestFocus(View.FOCUS_DOWN);
webview.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_UP:
if (!v.hasFocus()) {
v.requestFocus();
}
break;
}
return false;
}
});
Dv_MHの回答で10%に同意しました。ただし、添付クラスは少し過剰でした。 WebViewを拡張し、onCheckIsTextEditor()に対してtrueを返すだけでした。
import Android.content.Context;
import Android.util.AttributeSet;
import Android.webkit.WebView;
public class LiveWebView extends WebView {
public LiveWebView(Context context) {
super(context);
}
public LiveWebView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public LiveWebView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onCheckIsTextEditor() {
return true;
}
}
そこから、(ダイアログでも)通常のWebViewとして使用できました。
または、以下のコードで:
WebView web = new WebView(context) {
@Override
public boolean onCheckIsTextEditor() {
return true;
}
};
[〜#〜] important [〜#〜]これを検索するのに何時間も費やし、 「ViewGroup」を拡張する親レイアウトにはプロパティがありません
Android:descendantFocusability = "blocksDescendants"は、子レイアウトがフォーカスされないようにします
[〜#〜] or [〜#〜] Android:focusable = "true"をウェブビューに追加
AndroidChenの答えは私にはまったく機能しませんでしたが、提供されたリンクを検索しました( http://code.google.com/p/Android/issues/detail?id=7189 )と私は見つけました次のクラスでは、テキストだけでなく、すべてのボタン、リダイレクトなども完全に機能します(HTC BravoのAndroid Froyo)。
class LiveWebView extends WebView
{
Context mContext;
public LiveWebView(Context context, String URL)
{
super(context);
mContext = context;
setWebViewClient(URL);
}
@Override
public boolean onCheckIsTextEditor()
{
return true;
}
@SuppressLint("SetJavaScriptEnabled")
boolean setWebViewClient(String URL)
{
setScrollBarStyle(SCROLLBARS_INSIDE_OVERLAY);
setFocusable(true);
setFocusableInTouchMode(true);
requestFocus(View.FOCUS_DOWN);
WebSettings webSettings = getSettings();
webSettings.setSavePassword(false);
webSettings.setSaveFormData(false);
webSettings.setJavaScriptEnabled(true);
webSettings.setSupportZoom(false);
webSettings.setUseWideViewPort(false);
setOnTouchListener(new View.OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_UP:
if (!v.hasFocus())
{
v.requestFocus();
}
break;
}
return false;
}
});
this.setWebViewClient(new WebViewClient()
{
ProgressDialog dialog = new ProgressDialog(mContext);
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
loadUrl(url);
return true;
}
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
{
Toast.makeText(mContext, "Oh no! " + description, Toast.LENGTH_SHORT).show();
}
public void onPageStarted(WebView view, String url, Bitmap favicon)
{
if (dialog != null)
{
dialog.setMessage("Loading...");
dialog.setIndeterminate(true);
dialog.setCancelable(true);
dialog.show();
}
}
public void onPageFinished(WebView view, String url)
{
if (dialog != null)
{
dialog.cancel();
}
}
});
this.setWebChromeClient(new WebChromeClient()
{
public void onProgressChanged(WebView view, int progress)
{
// Activities and WebViews measure progress with different scales.
// The progress meter will automatically disappear when we reach 100%
}
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result)
{
result.confirm();
return true;
}
});
loadUrl(URL);
return true;
}
}
そしてダイアログ内でウェブビューを作成するために、このコードを書きました
AlertDialog.Builder alert = new AlertDialog.Builder(M_PaymentOptions.this);
alert.setNegativeButton("Back to Payment Options", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int id)
{}
});
alert.setTitle("BarclayCard Payment");
LiveWebView liveWevViewObject = new LiveWebView(M_PaymentOptions.this, redirecturl);
alert.setView(liveWevViewObject);
alert.show();
WebViewに非表示のEditTextを追加するだけです
<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical" Android:layout_width="match_parent"
Android:layout_height="match_parent">
<EditText
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:visibility="invisible" />
<WebView
Android:id="@+id/webView"
Android:layout_width="match_parent"
Android:layout_height="match_parent"/>
これらすべてのフォーカス関連ソリューションは、Samsung Note 3/Android 5.0では動作しませんでした