2011-11-04 20 views
7

Ho una visualizzazione Web e alcuni pulsanti nel mio layout. C'è un tag grande nella mia WebView. Questa app viene utilizzata per modificare i file di testo. I pulsanti sono usati per effettuare la textarea all'interno della mia WebView. Quando l'utente preme un pulsante (ad esempio un pulsante freccia per spostare la visualizzazione del testo) chiude la tastiera. Ho usato toggleSoftInput, ma questo semplicemente attiva o disattiva la tastiera. Voglio che i pulsanti smettano di nascondere la tastiera virtuale quando viene premuto il pulsante. Non ho trovato nulla sul mio problema specifico. Ho cercato per settimane. Qualcuno ha qualche idea su come posso impedire ai miei pulsanti di nascondere la tastiera virtuale su Android?Previene i pulsanti per nascondere la tastiera virtuale su Android

risposta

4

La soluzione al problema potrebbe essere quella di mantenere sempre visualizzata la tastiera e consentire all'utente di chiuderla quando vengono eseguite le azioni.

InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
inputManager.toggleSoftInput (InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY); 

provare questo codice nel metodo onCreate() della vostra attività. Si noti che se l'utente preme il pulsante di chiusura sulla tastiera o il pulsante indietro dovrebbe chiuderlo. E immagino che non dovresti interferire con quello scenario. E quando le azioni sono terminate, puoi chiudere la tastiera dal codice.

4

Sono esattamente sulla stessa barca, quindi se hai mai trovato una soluzione ideale, mi piacerebbe sentirla.

MODIFICA: Successo! O molto meglio di prima, comunque. Ho eliminato la mia vecchia soluzione, poiché questa è migliore.

Come indicato in https://stackoverflow.com/a/10536033/513038, risulta che loadData() nasconde la tastiera. Tuttavia,, ho scoperto che in hideSoftKeyboard() di WebView, controlla InputMethodManager per vedere se la webview è attiva, tramite imm.isActive (mWebView).

Quindi, se si passa a un EditText prima di loadData(), e si passa immediatamente a WebView dopo, la tastiera rimane in posizione! Passa brevemente in maiuscolo, penso di tornare a focalizzarmi sulla webview, (in realtà, questo non sembra sempre accadere, dipende) ma è molto meno evidente della tastiera che sfarfalla e torna indietro.

L'essenza di ciò che deve accadere è la seguente.

Estendere WebView. Dategli un campo EditText:

public EditText mFocusDistraction; 

Nel costruttore, hanno le seguenti righe:

mFocusDistraction = new EditText(context); 
addView(mFocusDistraction); 

poi sovrascrivere loadURL():

public void loadUrl(String s) { 
    mFocusDistraction.requestFocus(); 
    super.loadUrl(s); 
    this.requestFocus(); 
} 

Quello dovrebbe farlo funzionare, in pratica. E 'un po' buggy, però, quindi ecco una classe più completa:

import android.app.Activity; 
import android.content.Context; 
import android.util.AttributeSet; 
import android.webkit.WebView; 
import android.widget.EditText; 

public class WebViewMod extends WebView { 
    public EditText mFocusDistraction; 
    public Context mContext; 

    public WebViewMod(Context context) { 
     super(context); 
     init(context); 
    }  

    public WebViewMod(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(context); 
    }  

    public WebViewMod(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     init(context); 
    } 

    public WebViewMod(Context context, AttributeSet attrs, int defStyle, boolean privateBrowsing) { 
     super(context, attrs, defStyle, privateBrowsing); 
     init(context); 
    } 

    public void init(Context context) { 
     // This lets the layout editor display the view. 
     if (isInEditMode()) return; 

     mContext = context; 

     mFocusDistraction = new EditText(context); 
     mFocusDistraction.setBackgroundResource(android.R.color.transparent); 
     this.addView(mFocusDistraction); 
     mFocusDistraction.getLayoutParams().width = 1; 
     mFocusDistraction.getLayoutParams().height = 1; 
    } 

    @Override 
    public void loadUrl(final String url) { 
     if (mContext instanceof Activity && this.isFocused()) { 
      ((Activity)mContext).runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        mFocusDistraction.requestFocus(); 
        WebViewMod.super.loadUrl(url); 
        WebViewMod.this.requestFocus(); 
       } 
      }); 
     } else { 
      super.loadUrl(url); 
     } 
    } 
} 
+2

questo ha il problema di perdere la concentrazione da un campo di input/testo precedentemente selezionato. 1) selezionare l'input per la digitazione 2) loadUrl si chiama 3) la tastiera è ancora attiva, ma digitarla non fa nulla (non stai digitando più nello stesso input –

+0

@HaykSaakian Davvero?Non so; quello che ho funziona per me, e io non penso che abbia commesso degli errori quando l'ho messo qui. Suppongo che tu stia cercando di digitare la stessa webview che sta eseguendo loadUrl, giusto? – Erhannis

+0

forse è solo una piccola finestra di tempo, e nel tuo caso non te ne accorgi? nel mio caso ho una pagina che chiamo loadUrl a molte volte al secondo (pagina di chat che usa websocket java che inietta messaggi usando loadUrl con javascript) –

0

Xamarin Android (Alternativa):

InputMethodManager inputManager = (InputMethodManager)GetSystemService(Context.InputMethodService); 
inputManager.ToggleSoftInput (ShowFlags.Forced, HideSoftInputFlags.ImplicitOnly); 
Problemi correlati