2013-03-27 10 views
11

Attualmente ho uno TabHost contenente 4 schede. Su alcuni dei frammenti abbiamo un numero di viste EditText all'interno del layout.Le schede Tab Android si bloccano quando si utilizza la tastiera hardware

Abbiamo notato che quando si tenta di digitare in una delle EditText viste utilizzando la tastiera hardware, il focus è stato rubato dal EditText e dato alla scheda attualmente attivo nel TabHost. Questo si verifica solo su schermi con schede. C'è un modo semplice e veloce per risolvere questo?

+0

Hai provato questa soluzione alternativa? http://code.google.com/p/android/issues/detail?id=2516#c17 – Luis

+0

Sei riuscito a risolverlo? Sto avendo un problema simile. Mi chiedo se hai trovato qualcosa. – Renjith

+0

Abbiamo finito per prendere tutti gli input dall'attività e disabilitare il pulsante di invio. Non ne avevamo bisogno per nient'altro, quindi non era un grosso problema. Anche se non è una soluzione adeguata. –

risposta

3

Questo è stato un bug noto per un periodo piuttosto lungo:

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

Una soluzione sarebbe costringendo il TabHost perdere la concentrazione dopo aver selezionato una scheda. Questa operazione viene eseguita impostando e chiamando clearFocus nel metodo onTabChanged.

tabHost.setOnTabChangedListener(new OnTabChangeListener(){  
    public void onTabChanged(String tabID) {  
     tabHost.clearFocus(); 
    } 
}); 

MODIFICA: Se questo non funziona, puoi provare il contrario. Forzare i campi EditText per ottenere attenzione, invece:

OnTouchListener focusHandler = new OnTouchListener() { 
    @Override 
    public boolean onTouch(View view, MotionEvent event) { 
     // TODO Auto-generated method stub 
     view.requestFocusFromTouch(); 
     return false; 
    } 
}; 

editText.setOnTouchListener(focusHandler); //For each EditText with this issue 
+0

Il 'TabHost' ruba ancora fuoco quando inserisco il testo su un' Frammento' che contiene un 'TextView' con quel codice. –

+0

Aggiunto un altro esempio da provare. –

+1

Questo sembra risolvere parzialmente il problema.Se tocchi ovunque sulla pagina che non ha esplicitamente un 'View', il vecchio comportamento si ripresenta. –

1
@Override 
    public void onPageSelected(int position) { 
     // Unfortunately when TabHost changes the current tab, it kindly 
     // also takes care of putting focus on it when not in touch mode. 
     // The jerk. 
     // This hack tries to prevent this from pulling focus out of our 
     // ViewPager. 
     TabWidget widget = mTabHost.getTabWidget(); 
     int oldFocusability = widget.getDescendantFocusability(); 
     widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); 
     mTabHost.setCurrentTab(position); 
     widget.setDescendantFocusability(oldFocusability); 

    } 

copia-incolla dal supporto Android esempi di biblioteca

+0

Questo ha un effetto strano: inizialmente sembra che questo non funzioni, ma se sto digitando un sacco nella modifica, a un certo punto la digitazione inizia a funzionare normalmente. È sufficiente cancellare nuovamente i caratteri digitati per l'host della scheda per rubare lo stato attivo. W/o questo tipo di correzione molto rapidamente a volte funziona, ma non ha un effetto un po 'permanente come con la correzione. – ajeh

3

ho trovato questa soluzione al http://code.google.com/p/android/issues/detail?id=2516 e funziona meglio di qualsiasi delle soluzioni qui o sulla pagina di bug report, perché affronta la causa principale invece di aggirarla. Ti lascio l'autore (g1adrift) spiega:

Dopo aver scavato estensivamente attraverso il source Android, ho trovato il bug: TabHost registra un OnTouchModeChangeListener in onAttachedToWindow() che ruba attenzione al momento di lasciare la modalità touch (aka quando qualcuno preme una chiave ) se la visualizzazione del contenuto della scheda corrente non è attiva. Mentre questo può avere senso se l'intero layout è a schede, se c'è solo una porzione del layout che ha schede, causa problemi.

Questa soluzione rimuove che ascolta, in modo che tutti gli artefatti di usarlo dovrebbe andare via:

in onCreate(), aggiungere:

TabHost mTabHost = (TabHost) findViewById(android.R.id.tabhost); 
mTabHost.addOnAttachStateChangeListener(new OnAttachStateChangeListener() { 

    @Override 
    public void onViewDetachedFromWindow(View v) {} 

    @Override 
    public void onViewAttachedToWindow(View v) { 
     mTabHost.getViewTreeObserver().removeOnTouchModeChangeListener(mTabHost); 
    } 
}); 

Si suppone funziona solo per SDK 12+. L'autore ha anche pubblicato una soluzione per gli SDK precedenti. Se ne hai bisogno, fai clic sul link sopra e cerca i post di "g1adrift".

+0

Correzione slick, grazie! .. Si potrebbe anche sottoclasse 'TabHost' e implementare questo intefaccia lì (in monodroid)' public class MyTabHost: TabHost, View.IOnAttachStateChangeListener {...} ' – samosaris

Problemi correlati