2010-11-16 15 views
52

Ho creato la mia personale WebView e impostato gli oggetti WebChromeClient e WebViewClient. Quando avvio questa WebView, i campi modulo HTML reagiscono quando li tocco (appare un cursore), ma non vengono selezionati, né la tastiera virtuale viene avviata. Se utilizzo la trackball per scegliere il modulo e premerlo, appare la tastiera.Toccando il campo modulo in WebView non viene visualizzata la tastiera software

Ho provato a chiamare myWebview.requestFocusFromTouch() come this answer suggerito, ma restituisce false e non aiuta.

+0

hai fatto questo? : http://stackoverflow.com/questions/35465569/changing-the-input-source-of-form-fields-in-webview – debonair

risposta

94

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

Ecco una correzione nel caso in cui altri non erano chiari.

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

Thx ... questo comportamento sembra essere un bug, è stato corretto in ICS. – Janusz

+0

@androidchen Grazie mille ... risparmi il mio tempo :) –

+0

Ricevo degli errori con questo - mi vuole rinominare "onTouch" ... cosa faccio ??? Si prega di aiutare – Levchik

3

risposta di AndroidChen non ha funzionato per me a tutti, ma ho cercato il link fornito (http://code.google.com/p/android/issues/detail?id=7189) e ho trovato la seguente classe, funziona perfettamente (Android Froyo su HTC Bravo), non solo testo, ma anche tutti i pulsanti, reindirizza, ecc, tutto funziona perfettamente: 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; 
    } 
} 

e quindi di creare una WebView all'interno di una finestra di dialogo, ho scritto questo codice

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

Grazie, Dv_MH! Anche la risposta accettata non funziona per me, ma questa funziona. –

24

Concordato del 10% con Dv_MH di risposta. Tuttavia, la classe allegata era un po 'eccessiva. Tutto quello che dovevo fare era estendere WebView & ritorno vero per 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; 
    } 
} 

Da lì, sono stato in grado di usarlo come un normale WebView (anche in finestre di dialogo).

In alternativa, con meno codice:

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

Questo è stato l'unico che ha funzionato anche per me. Tutto il resto ha ignorato la tastiera virtuale. – kingargyle

+0

Questo ha funzionato per me (e non la prima risposta) su 'DialogFrament' – David

+0

Questo ha funzionato anche per me. L'ho fatto un po 'diversamente –

4

IMPORTANTE Ho passato ore a cercare per questo e ho risolto facendo in modo che il layout genitore che si estende "ViewGroup" non ha proprietà

android: descendantFocusability = "blocksDescendants" che impedisce di mettere a fuoco il layout secondario

O Aggiungi android: attivabile = "true" per WebView

+0

ha cercato il mio progetto per "discendantFocusability" cancellato quella riga e alla fine ha funzionato. Non era in una webView e non sono sicuro di come quella linea finisse nel codice sorgente. – chaggy

1

Basta aggiungere EditText invisibile sotto 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"/> 

Tutte queste soluzioni di messa a fuoco legate non ha funzionato sul mio Samsung Note 3/Android 5.0

Problemi correlati