2013-03-27 41 views
11

Tôi hiện có TabHost chứa 4 tab. Trên một số đoạn, chúng tôi có một số số EditText chế độ xem trong bố cục.Tab Máy chủ tab Android lấy cắp tiêu điểm khi sử dụng Bàn phím phần cứng

Chúng tôi nhận thấy rằng khi bạn cố gắng nhập vào bất kỳ chế độ xem nào trong số EditText bằng bàn phím phần cứng, tiêu điểm sẽ bị lấy cắp từ EditText và được cung cấp cho tab hiện đang hoạt động trong TabHost. Điều này chỉ xảy ra trên màn hình với các tab. Có cách nào nhanh chóng và đơn giản để giải quyết vấn đề này không?

+0

Bạn đã thử cách này chưa? http://code.google.com/p/android/issues/detail?id=2516#c17 – Luis

+0

Bạn có thể sắp xếp nó không? Tôi gặp vấn đề tương tự. Tự hỏi nếu bạn tìm thấy một cái gì đó. – Renjith

+0

Chúng tôi vết thương lên chỉ lấy tất cả đầu vào từ hoạt động và vô hiệu hóa nút nhập. Chúng tôi không cần nó cho bất cứ điều gì khác vì vậy nó không phải là một việc lớn. Mặc dù nó không phải là một giải pháp thích hợp. –

Trả lời

3

Đây là một lỗi được biết đến trong một thời gian khá dài:

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

Một cách giải quyết sẽ được buộc TabHost mất tập trung sau một tab được chọn. Điều này được thực hiện bằng cách đặt OnTabChangeListener cho số TabHost và gọi clearFocus theo phương thức onTabChanged.

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

EDIT: Nếu cách này không hiệu quả, bạn có thể thử cách khác. Buộc các lĩnh vực EditText để đạt được trọng tâm thay vì:

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' vẫn đánh cắp tiêu điểm khi tôi nhập văn bản vào một' Đoạn 'có chứa một 'TextView' với mã đó. –

+0

Đã thêm một ví dụ khác mà bạn có thể thử. –

+1

Điều đó dường như khắc phục được một phần vấn đề.Nếu bạn chạm vào bất kỳ vị trí nào trên trang không rõ ràng có 'Chế độ xem', hành vi cũ sẽ xuất hiện trở lại. –

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 từ hỗ trợ android ví dụ thư viện

+0

Điều này có hiệu ứng lạ: ban đầu có vẻ như điều này không hoạt động, nhưng nếu tôi gõ rất nhiều vào bản chỉnh sửa, thì tại một số điểm gõ bắt đầu hoạt động như bình thường. Đủ để xóa các ký tự đã nhập cho máy chủ tab để lấy lại tiêu điểm. W/o điều này sửa chữa gõ rất nhanh đôi khi hoạt động, nhưng nó không có hiệu ứng hơi vĩnh viễn như với sửa chữa. – ajeh

3

tôi tìm thấy giải pháp này tại http://code.google.com/p/android/issues/detail?id=2516 và nó hoạt động tốt hơn so với bất kỳ giải pháp ở đây hoặc trên trang báo cáo lỗi, bởi vì nó giải quyết nguyên nhân gốc rễ thay vì làm việc xung quanh nó. Tôi sẽ cho tác giả (g1adrift) giải thích:

Sau khi đào rộng rãi thông qua các nguồn Android, tôi thấy lỗi: TabHost đăng ký một OnTouchModeChangeListener trong onAttachedToWindow() rằng đánh cắp tập trung khi rời khỏi chế độ cảm ứng (aka khi ai đó nhấn phím ) nếu chế độ xem nội dung tab hiện tại không có tiêu điểm. Trong khi điều này có thể có ý nghĩa nếu toàn bộ bố cục được gắn thẻ, nếu chỉ có một phần bố cục có tab, nó gây ra sự cố.

workaround này loại bỏ mà người nghe, vì vậy tất cả các đồ tạo tác của việc sử dụng nó sẽ biến mất:

trong onCreate(), thêm:

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

Nó được cho là chỉ hoạt động cho SDK 12 +. Tác giả cũng đã đăng một giải pháp cho các SDK trước đó. Nếu bạn cần, hãy nhấp vào liên kết ở trên và tìm kiếm bài đăng theo "g1adrift".

+0

Slick sửa chữa, nhờ! .. Bạn cũng có thể phân lớp 'TabHost' và thực hiện này inteface có (trong monodroid)' public class MyTabHost: TabHost, View.IOnAttachStateChangeListener {...} ' – samosaris

Các vấn đề liên quan