2010-08-11 7 views
40

Wenn ich eine WebView Anzeige anzeige, wird die Soft-Tastatur nicht angezeigt. Die harte Tastatur funktioniert auch nicht!Das WebView-Textfeld zeigt die Tastatur nicht an

Was sind die üblichen Mängel.

Der Code, den ich für den Zugriff verwenden die WebView ist:

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); 
} 
} 
+0

meinst du, dass die tastatur nicht erscheint, wenn du auf der webseite bist, oder wenn du in ein textarea klickst? – Sephy

+0

vielleicht bedeutet er ein HTML-Eingabefeld innerhalb einer Website, die in der Webansicht angezeigt wird? –

+0

@Sephny: Wenn ich auf den Textbereich klicke, erscheint weder die Tastatur noch die auf einem Motorola Milestone verfügbare harte Tastatur! – Sana

Antwort

37

Das Problem war, dass webview war nicht Fokus bekommen, wenn es damit

webView.requestFocus(View.FOCUS_DOWN); 

mit geladen wurde das Problem gelöst.

+0

Siehe auch: http://code.google.com/p/android/issues/detail?id=7189 –

+2

Diese Lösung half nicht für Nexus 7 mit Jelly Bean, hat jemand andere Ideen? – user1159819

+0

ja !!! Netter, vielen Dank! :) – user280109

0

Ich hatte ein ähnliches Problem .... und später fand ich, dass das Textfeld auf der Webseite, die meine Web-Ansicht deaktiviert gezeigt wurde .

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

47

Die vollständige Lösung ist ein bisschen mehr als das, was Sana hatte. Es wird als Bug über auf der Android-Website (http://code.google.com/p/android/issues/detail?id=7189) dokumentiert:

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; 
    } 
}); 
+5

Es funktioniert nicht ... – Hugo

+0

Es funktionierte für mich, ohne diese Zeile: 'webView.RequestFocus (View.FOCUS_DOWN);'. – Tae

0

Ich war für mich genau das gleiche Problem keine der oben genannten Lösungen gearbeitet haben. Nach Jahren des Versuchs fand ich endlich das Problem.

Einige der verschiedenen Webseiten, die ich mit WebView gerendert habe, passten nicht richtig in die Webansicht und als Ergebnis wurde ein div (oder eine andere HTML-Komponente) unsichtbar über die Eingabefelder gelegt. Obwohl die Eingabefelder bei Berührung ausgewählt erschienen, erlaubten sie keine Texteingabe (selbst wenn es mir gelang, die weiche Tastatur mit dem Trackball zu erreichen).

Also die Lösung.

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

Hoffe das hilft dir.

8

Ich bin überrascht, dass sogar auf Android 4.1 (getestet auf SGS3) das Problem immer noch vorhanden ist, und OnTouch() overriding löst es nicht für mich.

Prüfregeln:

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 ersetzen mit MyWebView:

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); 
    } 
} 
+0

Es ist Arbeit.Tanks! – Hugo

+3

Danke! Das war die einzige Lösung, die für mich funktionierte. – jbc25

+1

In Jelly Bean +, keine der anderen Lösungen funktioniert. Dies sollte die akzeptierte Antwort sein! –

1

hatte ich das gleiche Problem auf Jelly Bean, aber keine der oben genannten Lösungen für mich gearbeitet. Diese Lösung war für mich auf JellyBean

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

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

6

eine Zeile Antwort und es funktioniert gut

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

wo wb ist mein Objekt webView

4

Hatte das gleiche Problem und nicht der oben genannten Lösungen funktioniert. Diese woked für mich

<CustomWebView 
    android:id="@+id/webView" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:focusable="true" 
    android:focusableInTouchMode="true" /> 
+1

Traurig, dass ich Ihre Wahl versucht habe, nachdem ich alle oben genannten Antworten ausprobiert habe !! – amalBit

+0

Für mich das gleiche, die einzige Antwort, die funktionierte. Ich setze es zur Laufzeit -> setFocusable (true); setFocusableInTouchMode (true); –

0

try this -> der Vorname der Name des Feldes ist und sicherstellen, dass es nicht Autofokus Attribut Dosis.

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

Denn es leicht machen, und wie die anderen Lösungen Probleme haben auf allen Geräten oder in jedem Zustand arbeiten, ich bin immer einen kleinen Hack, dieses Problem zu überwinden, ohne den Code zu berühren, fügen Sie einfach jeden versteckten editText das Layout enthält die webView, die automatisch den Fokus auf die ganze Sicht gewähren, und Sie werden über die Sorgen zu webView Textfeldern nicht mehr:

<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 wie Also:

<?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> 
Verwandte Themen