web-dev-qa-db-fra.com

Appuyer sur le champ du formulaire dans WebView n'affiche pas le clavier virtuel

J'ai créé mon propre WebView et défini les objets WebChromeClient et WebViewClient. Lorsque je démarre cette WebView, les champs du formulaire HTML réagissent lorsque je les touche (un curseur apparaît), mais ils ne sont pas sélectionnés et le clavier virtuel ne démarre pas. Si j'utilise le trackball pour choisir le formulaire et que j'appuie dessus, le clavier apparaît.

J'ai essayé d'appeler myWebview.requestFocusFromTouch() comme cette réponse suggérée, mais elle retourne false et n'aide pas.

54
Shawn Lauzon

http://code.google.com/p/Android/issues/detail?id=7189

Voici un correctif au cas où d'autres n'étaient pas clairs.

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

D'accord 10% avec la réponse de Dv_MH. Cependant, la classe ci-jointe était un peu excessive. Tout ce que je devais faire était d'étendre WebView et de renvoyer true pour onCheckIsTextEditor ()

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

À partir de là, j'ai pu l'utiliser comme une WebView normale (même dans les boîtes de dialogue).

Alternativement, avec moins de code:

WebView web = new WebView(context) {
  @Override
  public boolean onCheckIsTextEditor() {
    return true;
  }
};
27
Steve

[~ # ~] important [~ # ~] J'ai passé des heures à chercher cela et je l'ai résolu en m'assurant que la disposition parent qui étend "ViewGroup" n'a pas de propriété

Android: descendantFocusability = "blocksDescendants" qui empêchent la mise en page enfant de se concentrer

OU Ajouter Android: focusable = "true" à la vue Web

7
Mrad4Tech

La réponse d'AndroidChen n'a pas fonctionné pour moi du tout, mais j'ai recherché le lien fourni ( http://code.google.com/p/Android/issues/detail?id=7189 ) et j'ai trouvé le classe suivante, cela fonctionne parfaitement (Android Froyo sur HTC Bravo), pas seulement du texte, mais aussi tous les boutons, redirections, etc., tout fonctionne parfaitement: D

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

puis pour créer une vue web dans une boîte de dialogue, j'ai écrit ce code

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

Ajoutez simplement EditText invisible sous WebView

<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"/>

Toutes ces solutions liées à la mise au point ne fonctionnaient pas sur mon Samsung Note 3/Android 5.0

1
Homo Incognito