[英]How do clearFocus() and focusableInTouchMode=“true” work together?
我希望有人解釋以下兩種行為。
我從以下屏幕開始:
當我按下鍵盤的“完成”按鈕時,我將按預期返回到原始狀態。 換句話說,隱藏的框再次變得可見,並且光標消失了(EditText不再具有焦點)。 這是怎么回事,我只是有一個聽眾在等待按下“完成”按鈕。 發生這種情況時,我在EditText
視圖上調用clearFocus()
。 然后,我有一個OnFocusChangeListener
,它使所有框都不可見/可見,這取決於EditText是否具有焦點。
但是,只有在使用以下屬性設置祖先布局(即父母或祖父母RelativeLayout)時,我才會得到這種預期的行為: android:focusableInTouchMode="true"
否則,我得到以下屏幕:
調用clearFocus()
,它會跳至clearFocus()
中的下一個子級,即“當前城市”,並賦予EditText
焦點(並隱藏鍵盤,但這是預期行為的一部分)。
如果我未設置android:focusableInTouchMode="true"
則在屏幕1中單擊“當前城市”也會在屏幕3中產生結果。 換句話說,它保持在“當前城市”並且不會失去焦點。
問題有人可以解釋發生了什么嗎? 為什么android:focusableInTouchMode="true"
會導致這種奇怪的行為?
我在clearFocus()的源代碼上方的注釋中找到了答案:
“當該視圖要放棄焦點時調用。如果焦點被清除,則調用onFocusChanged(boolean,int,android.graphics.Rect)。注意:當視圖清除焦點時,框架將嘗試將焦點從因此,如果此View是最先關注焦點的View,則在框架將焦點置於此視圖之后,將調用與清除焦點相關的所有回調。”
換句話說,當一個視圖放棄焦點時,框架從根部開始遍歷層次結構,以尋找可以為其提供焦點的第一個視圖。 當我省略android:focusableInTouchMode="true"
,框架將焦點賦予“當前城市”,因為這是它發現的第一個可聚焦的視圖。 當多個事物可以集中在層次結構的同一級別上時,框架將從最接近實際xml代碼底部的視圖開始。 這樣做的原因是,如果2個視圖在層次結構中處於同一級別,並且您將這些視圖放置在屏幕上的相同位置,則最接近代碼底部的視圖將出現在屏幕頂部。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.