2013-03-27 9 views
11

Mam obecnie TabHost zawierający 4 zakładki. Na kilku fragmentach mamy liczbę widoków EditText w układzie.Zakładki Android TabHost wykradają ostrość podczas używania klawiatury sprzętowej

Zauważyliśmy, że gdy spróbujesz wpisać w którejkolwiek z EditText poglądów za pomocą klawiatury sprzętowej, nacisk został skradziony z EditText a dane na karcie aktywnego w TabHost. Dzieje się tak tylko na ekranach z kartami. Czy istnieje szybki i prosty sposób na rozwiązanie tego problemu?

+0

Czy próbowałeś tego obejścia? http://code.google.com/p/android/issues/detail?id=2516#c17 – Luis

+0

Czy byłeś w stanie to rozwiązać? Mam podobny problem. Zastanawiasz się, czy coś znalazłeś. – Renjith

+0

Po zakończeniu pobierania pobieramy wszystkie dane wejściowe z działania i wyłączamy przycisk Enter. Nie potrzebowaliśmy go do niczego innego, więc nie było to nic wielkiego. Chociaż nie jest to właściwe rozwiązanie. –

Odpowiedz

3

Zostało to znany bug od dłuższego czasu:

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

Rozwiązaniem byłoby zmuszanie TabHost stracić ostrość po wybraniu karty. Dokonuje się tego, ustawiając OnTabChangeListener dla TabHost i wywołując clearFocus w metodzie onTabChanged.

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

EDYCJA: Jeśli to nie zadziała, możesz spróbować na odwrót. Zmuszając pola EditText aby uzyskać ostrość zamiast:

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

'TabHost' nadal kradnie fokus, gdy wprowadzam tekst na' Fragment', który zawiera 'TextView' z tym kodem. –

+0

Dodano kolejny przykład, który możesz wypróbować. –

+1

To wydaje się częściowo rozwiązać problem.Jeśli naciśniesz w dowolnym miejscu na stronie, która nie ma wyraźnego "widoku", stare zachowanie powstaje ponownie. –

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 z przykładów bibliotecznych android wsparcia

+0

Ma to dziwny efekt: początkowo wygląda na to, że to nie działa, ale jeśli piszę partie do edycji, to w pewnym momencie pisanie zaczyna działać normalnie. Wystarczy usunąć wpisane znaki dla hosta kart, aby ponownie wykraść fokus. W/o to pisanie bardzo szybko czasami działa, ale nie ma w pewnym stopniu stałego efektu, jak w przypadku poprawki. – ajeh

3

Znalazłem rozwiązanie na http://code.google.com/p/android/issues/detail?id=2516 i działa lepiej niż którykolwiek z rozwiązaniami tutaj lub na strona raportu o błędach, ponieważ adresuje ona główną przyczynę, zamiast ją obejść. Powiem autor (g1adrift) wyjaśnić:

Po wykopaniu obszernie przez źródło Android, znalazłem błąd: TabHost rejestruje OnTouchModeChangeListener w onAttachedToWindow() że kradnie ostrość przy wychodzeniu z trybu dotykowego (aka gdy ktoś naciśnie klawisz ), jeśli bieżący widok zawartości karty nie ma fokusu. Chociaż ten może mieć sens, jeśli cały układ jest zapisany w kartach, jeśli jest tylko jedna część układu z zakładkami, powoduje to problemy.

To obejście usuwa tego słuchacza, więc wszystkie artefakty korzystali powinien odejść:

w onCreate(), dodać:

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

To podobno działa tylko dla SDK 12+. Autor opublikował także rozwiązanie dla wcześniejszych zestawów SDK. Jeśli potrzebujesz, kliknij powyższy link i wyszukaj posty "g1adrift".

+0

Zręczne poprawki, dziękuję! .. Można również podklasować 'TabHost' i zaimplementować to inteface tam (w monodroid)' public class MyTabHost: TabHost, View.IOnAttachStateChangeListener {...} ' – samosaris

Powiązane problemy