web-dev-qa-db-ja.com

WebViewのフォームフィールドをタップしてもソフトキーボードが表示されない

独自のWebViewを作成し、WebChromeClientおよびWebViewClientオブジェクトを設定しました。このWebViewを起動すると、HTMLフォームフィールドはタッチすると反応します(カーソルが表示されます)が、選択されず、ソフトキーボードも起動しません。トラックボールを使用してフォームを選択して押すと、キーボードが表示されます。

myWebview.requestFocusFromTouch()この回答 のように呼び出そうとしましたが、falseを返し、助けにはなりません。

54
Shawn Lauzon

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;
        }
    });
96
androidchen

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;
  }
};
27
Steve

[〜#〜] important [〜#〜]これを検索するのに何時間も費やし、 「ViewGroup」を拡張する親レイアウトにはプロパティがありません

Android:descendantFocusability = "blocksDescendants"は、子レイアウトがフォーカスされないようにします

[〜#〜] or [〜#〜] Android:focusable = "true"をウェブビューに追加

7
Mrad4Tech

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();
4
Dv_MH

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では動作しませんでした

1
Homo Incognito