2012-06-30 81 views
3

我在tabhost中顯示EditText。 Tabhost在SherlockFragmentActivity中。當活動中出現TabHost時,EditText使用硬鍵盤失去焦點

假設我處於觸摸模式,並且我點擊EditText使其焦點並開始鍵入它。輸入2-3個字符後,我決定使用我的硬鍵盤。只要按下第一個硬鍵,我就移出觸摸模式,這也會導致焦點移回到當前選定的選項卡。只要我不使用硬導航鍵將焦點帶回到我的EditText,我將無法輸入EditText。

僅當TabHost不在TabActivity內部時,纔會導致此問題。

重現此問題的快速示例代碼可能是 - ActionBarSherlock示例代碼的FragmentTabs活動。選擇CustomTab並嘗試使用硬鍵盤在操作欄中的搜索視圖內鍵入任何文本。看到焦點簡單地移動到選項卡。

問題可以在android 2.2,4.0上重現,也可以使用ICS仿真器。

有沒有人有更多的信息。關於這個問題?

(一種解決方法似乎是這裏所說的:https://stackoverflow.com/a/8684025/333137但它看起來像一個黑客)

感謝。

編輯:經過更多調查, 我發現了TabHost類中的setup()函數,只有在TabAost內部沒有使用TabHost時才需要調用它。 它註冊了一個只有在按下硬鍵時才接收回調的按鍵監聽器。

void setup(){ 
     // KeyListener to attach to all tabs. Detects non-navigation keys 
     // and relays them to the tab content. 
     mTabKeyListener = new OnKeyListener() { 
      public boolean onKey(View v, int keyCode, KeyEvent event) { 
       switch (keyCode) { 
        case KeyEvent.KEYCODE_DPAD_CENTER: 
        case KeyEvent.KEYCODE_DPAD_LEFT: 
        case KeyEvent.KEYCODE_DPAD_RIGHT: 
        case KeyEvent.KEYCODE_DPAD_UP: 
        case KeyEvent.KEYCODE_DPAD_DOWN: 
        case KeyEvent.KEYCODE_ENTER: 
         return false; 

       } 
       **mTabContent.requestFocus(View.FOCUS_FORWARD);** 
       return mTabContent.dispatchKeyEvent(event); 
      } 

我不知道爲什麼它被調用requestFocus的(View.FOCUS_FORWARD),但這不會將焦點設置到EditText上裏面(這是它應該?)。另外,如果在操作欄中搜索視圖,則完全在標籤外部。

+0

請參閱這篇文章。 http://stackoverflow.com/questions/6006518/hard-keyboard-fail-to-focus-edittext – Hank

+0

感謝true_cp,我在上面的qn中提到過這篇文章。這似乎是一個黑客,並不會在我的情況下工作。 –

回答

15

覆蓋TabHost如下,它適用於我。

public class TabHostExt extends TabHost { 

    public TabHostExt(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public TabHostExt(Context context) { 
     super(context); 
    } 

    @Override 
    public void onTouchModeChanged(boolean isInTouchMode) { 
     // leave it empty here. It looks that when you use hard keyboard, 
     // this method will be called and the focus will be token. 
    } 
} 
+0

漢克 - 我知道這篇文章很舊,但是想跟進,因爲我在這裏被鏈接到一個非常相似的情況。我在SherlockActivity中有一個ViewPagerActivity,並且我看到TabHost從EditText中竊取Focus的行爲。你是否覆蓋活動或片段中的TabHost功能?謝謝 - 下面有更多信息。 – mattdonders

+0

作爲另一個說明,我嘗試在EditText的'onFocusChangeListener()'內部調用'getCurrentFocus()',並且我看到TabHost試圖竊取焦點並且有一個'NullPointerException',並且在日誌中我看到了'onTouchModeChanged )'試圖在TabHost上執行,但是擴展TabHost和覆蓋函數似乎不起作用。我已經在片段和活動中嘗試過。 – mattdonders

+1

@mattdonders,'onTouchModeChanged()'是TabHostExt方法,我不明白你在「Activity或Fragment中覆蓋」的問題。我的TabHostExt用於片段。對於NPE,你能說出你的casem'mCurrentView'或'mTabWidget'中的哪個對象爲空嗎? – Hank