webentwicklung-frage-antwort-db.com.de

WebView-Textbereich öffnet die Tastatur nicht

Wenn ich eine WebView anzeige, sehe ich nicht, dass die Soft-Tastatur auftaucht. Die harte Tastatur funktioniert auch nicht!

Was sind die üblichen Mängel.

Der Code, den ich für den Zugriff auf die Variable WebView verwende, lautet:

package com.example.blahblah;

import Android.app.Activity;
import Android.content.Intent;
import Android.content.SharedPreferences;
import Android.os.Bundle;
import Android.os.Handler;
import Android.preference.PreferenceManager;
import Android.util.Log;
import Android.view.KeyEvent;
import Android.view.Window;
import Android.webkit.JsResult;
import Android.webkit.WebChromeClient;
import Android.webkit.WebSettings;
import Android.webkit.WebView;
import Android.webkit.WebViewClient;
import Android.widget.Toast;

public class createAccount extends Activity {

private static final String LOG_TAG = "Create Account";
private WebView mWebView;
private static final String URL = blah_app.urlSelected+"createAccount.html";    
private Handler mHandler = new Handler();

@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    Toast.makeText(createAccount.this, "URL = " +URL, Toast.LENGTH_SHORT).show();
    getWindow().requestFeature(Window.FEATURE_PROGRESS);
    setContentView(R.layout.webview);
    getWindow().setFeatureInt(Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_ON);

    mWebView = (WebView) findViewById(R.id.webview);

    WebSettings webSettings = mWebView.getSettings();
    webSettings.setSavePassword(true);
    webSettings.setSaveFormData(true);
    webSettings.setJavaScriptEnabled(true);
    webSettings.setSupportZoom(true);


    final Activity activity = this;
    mWebView.setWebChromeClient(new WebChromeClient() {
    public void onProgressChanged(WebView view, int progress) {

        activity.setProgress(progress * 1000);
      }
    });

    mWebView.addJavascriptInterface(new DemoJavaScriptInterface(), "demo");
    mWebView.clearCache(true);
    setProgressBarVisibility(true);
    mWebView.setWebViewClient(new WebViewClient() {
          public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show();
          }

           @Override  
           public void onPageFinished(WebView view, String url)  
           {  
               mWebView.loadUrl("javascript:(function () { " +
                       "setVariables("+blah_app.numberSelected+",'"+blah_app.urlSelected+"');" +
                       "})()");
           }
        });

    mWebView.loadUrl(URL);
}

final class DemoJavaScriptInterface {

    public void setData(String fname, String lname, String gacct, String phone) {

        SharedPreferences prefCreateAccount = PreferenceManager.getDefaultSharedPreferences(createAccount.this);
        SharedPreferences.Editor editor = prefCreateAccount.edit();
        editor.putString("FirstName", fname);
        editor.putString("LastName", lname);
        editor.putString("GmailAcct", gacct);
        editor.putString("Phone", phone);
        editor.commit();    

    }
    DemoJavaScriptInterface() {

    }

    /**
     * This is not called on the UI thread. Post a runnable to invoke
     * loadUrl on the UI thread.
     */
    public void clickOnAndroid() {
        mHandler.post(new Runnable() {
            public void run() {
                mWebView.loadUrl("javascript:wave()");
            }
        });
    }
}

/**
 * Provides a hook for calling "alert" from javascript. Useful for
 * debugging your javascript.
 */
final class MyWebChromeClient extends WebChromeClient {
    @Override
    public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
        Log.d(LOG_TAG, message);
        result.confirm();
        return true;
    }
}

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
        startActivity(new Intent(getApplication(), blah_app.class));
        return true;
    }
    return super.onKeyDown(keyCode, event);
}
}
40
Sana

Das Problem bestand darin, dass Webview beim Laden nicht geladen wurde

webView.requestFocus(View.FOCUS_DOWN);

problem gelöst.

37
Sana

Die vollständige Lösung ist etwas mehr als das, was Sana hatte. Es ist als Fehler auf der Android-Website dokumentiert ( 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;
    }
});
47
Jeff Peiffer

Ich bin überrascht, dass selbst unter Android 4.1 (getestet auf SGS3) das Problem immer noch vorhanden ist und das Überschreiben von onTouch () das Problem nicht löst.

Testcode:

String HTML = "<html><head>TEST</head><body><form>";
HTML += "<INPUT TYPE=TEXT SIZE=40 NAME=user value=\"your name\">";
HTML += "</form></body></html>";

WebView wv = new WebView(getContext());
wv.loadData(HTML, "text/html", null);

final AlertDialog.Builder adb = new AlertDialog.Builder(getContext());
adb.setTitle("TEST").setView(wv).show();

Meine komplexe Lösung ist, WebView durch MyWebView zu ersetzen:

private static class MyWebView extends WebView
{
    public MyWebView(Context context)
    {
        super(context);
    }

    // Note this!
    @Override
    public boolean onCheckIsTextEditor()
    {
        return true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev)
    {
        switch (ev.getAction())
        {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_UP:
                if (!hasFocus())
                    requestFocus();
            break;
        }

        return super.onTouchEvent(ev);
    }
}
8
RuslanK

eine Zeile Antwort und es funktioniert gut

// define webview for browser
wb = (WebView) findViewById(R.id.webView1);
wb.requestFocusFromTouch();

wo wb mein Objekt von webView ist

6
rahul

Für diejenigen, die auf der Suche nach einer Lösung sind, wenn sich die WebView in einer AlertDialog befindet, löste die Antwort hier dieses Problem für mich: Softtastatur in AlertDialog mit einem WebView anzeigen (Android)

4
elBradford

Hatte das gleiche Problem und keine der oben genannten Lösungen funktionierte. Das hat bei mir funktioniert

    <CustomWebView
    Android:id="@+id/webView"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:focusable="true"
    Android:focusableInTouchMode="true" />
4
Panzenbaby

Ich hatte das gleiche Problem mit Jelly Bean, aber keine der oben genannten Lösungen funktionierte für mich. Diese Lösung funktionierte bei JellyBean für mich

WebView webView = new WebView(getActivity(), null, Android.R.attr.webViewStyle);

Manchmal wird der Android.R.attr.webViewStyle nicht standardmäßig angewendet. Dadurch wird sichergestellt, dass der Stil immer angewendet wird.

1
Kevin Grant

Ich hatte das gleiche Problem, dass keine der oben genannten Lösungen für mich funktionierte. Nach jahrelangen Versuchen fand ich endlich das Problem.

Einige der verschiedenen Webseiten, die ich mit WebView renderte, passten nicht richtig in die Webansicht. Daher wurde ein div (oder eine andere HTML-Komponente) unsichtbar über die Eingabefelder gelegt. Obwohl die Eingabefelder bei Berührung als ausgewählt angezeigt wurden, ließen sie keine Texteingabe zu (selbst wenn ich es geschafft habe, die Soft-Tastatur mit dem Trackball aufzurufen).

Also die lösung.

WebView.getSettings().setUseWideViewPort(true);

Dies stoppt das Problem nicht vollständig, sondern macht die Ansicht eher wie ein PC-Browser, für den die Websites entwickelt wurden. Weniger Änderung der Überlagerung.

Hoffe das hilft dir.

0
gumbercules

versuchen Sie dies -> Der Vorname ist der Name des Feldes und vergewissern Sie sich, dass es kein Autofokusattribut hat.

    mWebView.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url) {
            mWebView.loadUrl("javascript:document.getElementById(\"firstname\").focus();");
        }
    });
0
Manisha

Um es einfach zu machen, und da bei den anderen Lösungen Probleme auf allen Geräten oder in jedem Zustand auftreten, verwende ich immer einen kleinen Hack, um dieses Problem zu lösen, ohne den Code zu berühren. Fügen Sie einfach versteckte editText zum Layout hinzu, die die webView enthält Der Fokus wird automatisch der gesamten Ansicht zugewiesen, und Sie müssen sich nicht mehr um die Textfelder webView kümmern:

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

Das gesamte Layout wäre also so:

<?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>
0
Muhammed Refaat

Ich hatte ein ähnliches Problem ... und später stellte ich fest, dass das Textfeld auf der Webseite, das meine Webansicht zeigte, deaktiviert war.

Überprüfen Sie dies, wenn die Seite das gleiche Problem im Browser hat.

0
Prasham