2013-03-27 6 views
11

Ich habe derzeit eine TabHost enthält 4 Registerkarten. Auf einigen der Fragmente haben wir eine Anzahl von EditText Ansichten innerhalb des Layouts.Android TabHost Tabs stehlen Fokus bei der Verwendung von Hardware Tastatur

Wir haben bemerkt, dass, wenn Sie in eine der EditText Ansichten über die Hardware-Tastatur, um versuchen, den Fokus vom EditText gestohlen und an die gerade aktive Registerkarte in der TabHost gegeben. Dies geschieht nur auf Bildschirmen mit Tabs. Gibt es eine schnelle und einfache Lösung?

+0

Haben Sie diese Problemumgehung versucht? http://code.google.com/p/android/issues/detail?id=2516#c17 – Luis

+0

Konnten Sie es aussortieren? Ich habe ähnliches Problem. Sie fragen sich, ob Sie etwas gefunden haben. – Renjith

+0

Wir haben einfach alle Eingaben aus der Aktivität übernommen und die Eingabetaste deaktiviert. Wir brauchten es für nichts anderes, also war es keine große Sache. Obwohl es keine richtige Lösung ist. –

Antwort

3

Dies war ein bekannter Fehler für eine recht lange Zeit:

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

Eine Abhilfe der TabHost zwingen würde, den Fokus zu verlieren, nachdem eine Registerkarte ausgewählt ist. Dies wird durch Setzen einer OnTabChangeListener für die TabHost und Aufruf clearFocus in der onTabChanged Methode getan.

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

EDIT: Wenn das nicht funktioniert, können Sie anders herum versuchen.

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

Der 'TabHost' stiehlt immer noch den Fokus, wenn ich Text auf ein' Fragment' gebe, das eine 'TextView' mit diesem Code enthält. –

+0

Ein weiteres Beispiel hinzugefügt, das Sie ausprobieren könnten. –

+1

Das scheint das Problem teilweise zu beheben.Wenn Sie irgendwo auf die Seite tippen, die nicht explizit eine 'Ansicht' hat, tritt das alte Verhalten wieder auf. –

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); 

    } 

copy-paste von Android-Support-Bibliothek Beispiele

+0

Das hat einen merkwürdigen Effekt: Am Anfang sieht es so aus, als ob das nicht funktioniert, aber wenn ich viel in den Schnitt eintippe, dann fängt es irgendwann an normal zu arbeiten. Es genügt, die eingegebenen Zeichen für den Tab-Host zu löschen, um den Fokus erneut zu stehlen. Ohne diesen Fix funktioniert manchmal sehr schnell, aber es hat keine dauerhafte Wirkung wie beim Fix. – ajeh

3

Ich fand diese Lösung bei http://code.google.com/p/android/issues/detail?id=2516 und es funktioniert besser als jede der Lösungen hier oder auf der: Fokus stattdessen zu gewinnen, die EditText Felder Erzwingen Fehlerberichtsseite, weil sie die Ursache anspricht, anstatt sie zu umgehen. Ich werde der Autor (g1adrift) erklären lassen:

Nach großem Umfang durch die Android Quelle zu graben, fand ich den Fehler: TabHost eine OnTouchModeChangeListener in onAttachedToWindow Register() , das den Fokus stiehlt, wenn Touch-Modus zu verlassen (auch bekannt als wenn Jemand drückt einen Schlüssel ), wenn die aktuelle Tab-Inhaltsansicht keinen Fokus hat. Während diese möglicherweise sinnvoll ist, wenn das gesamte Layout Registerkarten ist, wenn es nur einen Teil des Layouts mit Registerkarten gibt, verursacht es Probleme.

Diese Problemumgehung, dass Zuhörer entfernt, so alle Artefakte des Verwendens es gehen weg:

in onCreate() hinzufügen:

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

es angeblich funktioniert nur für SDK 12 Jahren. Der Autor veröffentlichte auch eine Lösung für frühere SDKs. Wenn Sie es brauchen, klicken Sie auf den obigen Link und suchen Sie nach Beiträgen von "g1adrift".

+0

Slick fix, thanks! .. Sie könnten auch 'TabHost' ableiten und diese Schnittstelle dort (in monodroid)' public class MyTabHost: TabHost, View.IOnAttachStateChangeListener {...} 'implementieren – samosaris