2013-03-27 30 views
11

Şu anda 4 sekmeli bir TabHost ürünüm var. Parçaların birkaçında, düzen içinde EditText görüntülenme sayısı bulunmaktadır.Android TabHost sekmeleri, Donanım Klavyesini kullanırken odak çalma

Biz donanım klavyesini kullanarak EditText görüşlerin hiçbirine yazmaya çalıştığınızda, odak EditText çalınan ve TabHost şu anda etkin sekmede verilir fark etmiş. Bu sadece sekmeli ekranlarda gerçekleşir. Bunu çözmek için hızlı ve basit bir yolu var mı?

+0

Bu geçici çözümü denediniz mi? http://code.google.com/p/android/issues/detail?id=2516#c17 – Luis

+0

Bunu çözebildiniz mi? Benzer bir sorun yaşıyorum. Bir şey bulursan merak ediyorum. – Renjith

+0

Tüm girdiyi sadece etkinlikten alıp giriş düğmesini devre dışı bıraktık. Başka bir şey için buna gerek yoktu, bu yüzden büyük bir anlaşma değildi. Uygun bir çözüm olmasa da. –

cevap

3

Bu oldukça uzun bir süre için bilinen bir hata olmuştur:

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

ilişkin bir çözüm, sekme seçildikten sonra odak kaybetmek TabHost zorlayacağımı. Bu, TabHost için OnTabChangeListener ayarlanarak veyöntemini onTabChanged yönteminde çağırarak yapılır.

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

DÜZENLEME: Bu işe yaramazsa, başka bir şekilde deneyebilirsiniz. android destek kitaplığı örneklerden

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 ', bu kodla bir' TextView' içeren bir 'Fragment' parçasına metin girdiğimde hala odaklanıyor. –

+0

Deneyebileceğiniz başka bir örnek eklendi. –

+1

Bu, sorunu kısmen düzeltmek gibi görünüyor.Sayfada açıkça bir "Görünüm" olmayan bir yere dokunursanız, eski davranış yeniden ortaya çıkar. –

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

    } 

kopyala-yapıştır

+0

Bu garip bir etkiye sahiptir: başlangıçta bunun işe yaramamış gibi görünmesine karşın, düzenlemeye birçok yazı yazıyorsam, bir noktada yazım normal olarak çalışmaya başlar. Odağı tekrar çalmak için sekme ana bilgisayarının yazılan karakterlerini silmek yeterlidir. Bu düzeltme çok hızlı bir şekilde yazıldığında bazen işe yarar, ancak düzeltmeyle ilgili olarak biraz kalıcı bir etkisi yoktur. – ajeh

3

Ben http://code.google.com/p/android/issues/detail?id=2516 bu çözüm bulduk ve burada veya çözümlerin hepsinden daha iyi çalışır: EditText alanlarını zorlamak yerine odağı kazanmak için Hata raporu sayfası, bunun etrafında çalışmak yerine kök nedenini ele aldığından. Ben yazar (g1adrift) açıklayalım edeceğiz: dokunma modu çıkarken odağı çaldı onAttachedToWindow bir OnTouchModeChangeListener() (aka kaydeder TabHost:

Android kaynak üzerinden yoğun kazma sonra ben hata buldum Mevcut sekme içerik görünümünde odak yoksa, birisi anahtarına basar. Tüm düzen sekmeli ise, bu mantıklı olabilir, ancak sekmeler olan düzeninin yalnızca bir bölümü varsa, sorunlara neden olur.

Bu geçici çözüm bu dinleyici, bu uzağa gitmeli kullanmanın nedenle tüm eserler kaldırır: onCreate içinde

() ekleyin:

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

Güya sadece 12+ SDK için çalışır. Yazar ayrıca önceki SDK'lar için de bir çözüm gönderdi. İhtiyacınız varsa, yukarıdaki bağlantıyı tıklayın ve "g1adrift" mesajlarını arayın.

+0

Kaygan düzeltme, teşekkürler! .. Ayrıca, TabHost alt sınıfını ve bu inteface orada uygulayabilirsiniz (monodroid) public class MyTabHost: TabHost, View.IOnAttachStateChangeListener {...} ' – samosaris