2014-05-22 58 views
10

對於Android視圖,setFocusablesetFocusableInTouchMode之間的區別是什麼?setFocusable和setFocusableInTouchMode有什麼區別?

其他問題嘗試讀取documentation後:

以及如何從isFocusableisFocusableInTouchMode這些不同?

+1

這在文檔中有明確說明。 – nhaarman

+6

我經常發現堆棧溢出的解釋比文檔更容易理解。我正試圖通過現在的文檔,但我無法理解它。我希望這裏有人會願意解釋,也許舉一個例子。 – Suragch

+0

我在下面添加了我自己的答案,以更清楚地解釋當我問到時我不明白的事情。 – Suragch

回答

16

setFocusable主要用於在觸摸模式和小鍵盤模式(使用上/下/下一個鍵)上啓用/禁用視圖的焦點事件。

setFocusableInTouchMode主要用於單獨在觸摸模式下啓用/禁用視圖的焦點事件。

如果您被禁用setFocusable它也禁用了視圖在觸摸模式下的焦點事件。

+0

如果我調用setFocusableInTouchMode(true)我還需要調用setFocusable(true)還是已經隱含? – Suragch

+1

不可以。您只能調用setFocusableInTouchMode(true),但確保您沒有調用setFocusable(false)。 – Rajkumar

+0

非常感謝。當我需要的時候我都設置了setFocusable。不幸的是,這是因爲當找到關於明確設定焦點的信息時,該人建議使用兩者(顯然還沒有完全理解這種差異)。 – LoungeKatt

16

在閱讀@Raj的回答後,通過Android documentation以及試驗代碼,我想我明白他們現在的工作有多好一些。如果其他人同樣感到困惑,這裏有一些額外的幫助。讓我知道如果我錯了。

視圖可以集中或不重點。一些觀點在聚焦時改變其外觀。當使用鍵盤導航佈局時,這可能特別有用。通過這種方式,您可以在實際點擊視圖之前知道自己的位置。即使是在using a selector and drawables可以做到這一點時也不會自然改變的視圖。但是,如果您不使用鍵盤進行導航,焦點並不重要。

有3對東西都困惑我:

isFocusable() 
isFocusableInTouchMode() 

setFocusable() 
setFocusableInTouchMode() 

requestFocus() 
requestFocusFromTouch() 

第一對剛纔告訴你的視圖的信息。也就是說,這個觀點是否有可能得到重視。你可以這樣做:

Boolean b = myView.isFocusable(); 

你在觸摸屏幕後處於觸摸模式。因此,當您使用鍵盤時可能會聚焦的物體在使用手指時可能無法聚焦。您可以檢查這樣的:

Boolean b = myView.isFocusableInTouchMode(); 

就像我說的,這只是告訴你它是偶數可能給視圖焦點與否的信息。如果你想真正提出觀點焦點,首先你必須讓焦點成爲可能。如果你在觸摸模式,你叫setFocusableInTouchMode(true)那麼這兩個myView.isFocusable()myView.isFocusableInTouchMode()將返回true

myView.setFocusable(true); 
myView.setFocusableInTouchMode(true); 

:你可以用下面的命令之一做到這一點。你不需要給他們打電話。但是,如果您只撥打myView.setFocusable(true),則不會更改myView.isFocusableInTouchMode()

我們終於使視圖集中,你必須調用如下

myView.requestFocus(); 

我還是因爲只是用requestFocus()工作對我來說並不完全理解requestFocusInTouchMode(),但documentation說,大約requestFocusInTouchMode()

調用此方法可試圖將焦點放在特定視圖或其後面的某個子視圖上。這是requestFocus()的一個特殊變體,它將允許在觸摸模式下不可聚焦的視圖請求聚焦。

最後,應該指出的是,Romain Guy在此post說:

這是在觸摸模式可聚焦有奇怪反應,除非你完全瞭解你在做什麼,你不應該使用它的視圖。 requestFocus()工作,但只有當設備不處於觸摸模式時才顯示焦點。只要用戶觸摸屏幕,焦點就不會再顯示。通過做你正在做的事情,你正在使你的應用程序的行爲與系統的其他部分有所不同,並且你冒着奇怪的行爲。

+0

這實際上與接受的答案相矛盾。 setFocusable覆蓋了兩者,而setFocusableInTouchMode只覆蓋自身。例如,您希望用戶能夠觸摸ImageView,但不能用鍵盤選擇它,因此您可以使用setFocusableInTouchMode。 – LoungeKatt