這幾天一直在解決一個焦點切換的問題,由於是直接用另外一家公司的程式碼,沒有細看。當應用到測試那邊,發現了這個問題,而且真機除錯有些問題,不能單步除錯,後來是看日誌才發現這個問題。
ViewA包含幾個可以獲取焦點的幾個View:View B, View C, View D,...,
當View B是預設獲取的焦點的View。
當將View C獲取焦點後,當處理完相應的事件後,比如播放視訊什麼,需要將焦點傳給View D,但是執行的時候,發現,當View C處理完相應的事件後,焦點卻又回到了View B。而且檢查了程式碼,發現在View C處理完相應的事件後,確實呼叫了View D的requestFocus() 方法。
研究了好久,後來將日誌開關,開啟了,才發現了,在呼叫View D的requestFocus() 方法之前,焦點就到了ViewB上。
所以,認真檢查了呼叫View D的requestFocus() 方法附件的程式碼,發現,在這之前,呼叫了View C的setVisibility方法將ViewD這個View隱藏掉,所以導致將焦點交給父View即View A來處理焦點事宜,而View A就預設地將焦點交給了View B,這樣就出現了測試人員發現的問題。
所以,正確的做法是:
在呼叫View D的requestFocus() 方法之後,才能呼叫View C的setVisibility(View.INVISIBLE)或setVisibility(View.GONE)方法,避免父控制元件收回焦點的控制權。