2011-06-14 39 views
1

所有在整個開發documents & tutorials,他們reccomend使用findViewById()到「查找被認定通過從在的onCreate(捆綁)處理XML id屬性視圖」,所以我完全被利用到處都需要一個視圖來引用xml文件中的某些東西。這導致了一些問題,比如如果我需要使用靜態方法中的視圖,或者據我所知,除onCreate之外的任何方法。最近我偶然發現了setId(),它除了簡單易用,因爲它遵循標準的「getters & setters」協議,所以它除了更簡潔,更具可讀性之外,似乎對您在應用程序中的使用位置沒有要求。findViewById VS SETID

什麼是真正的區別是:

setId - 「設置此視圖的標識符標識不必在此視圖的層次結構獨特的標識符應該是一個正數。」

&

findViewById - 「查找具有給定id的子視圖如果該視圖具有給定id,返回此視圖」

它們是可以互換的嗎?有沒有隻允許使用其中一種的情況?

+0

似乎在調用'findViewById'之前在視圖上調用'setId'會導致一個fc在哪裏不曾是一個,但也許這裏還有其他事情發生? – 2011-06-14 19:43:32

回答

1

這些是完全不同的方法。實際上,setId對於設置視圖的ID很有用,以便以後可以使用findViewById再次查找。當您知道視圖的ID時,使用findViewById,並且您想要獲取與該ID關聯的實際對象View。如果您已有View對象,並且您想爲其設置標識符,則可以使用setId,以便稍後可以使用findViewById再次找到同樣的View對象。

+0

所以如果我重複使用視圖,我可以執行EditText view =(EditText)findViewById(R.id .thinga);'首先,然後再''view.setId(R.id.thingb);'etc? – 2011-06-14 19:58:58

+0

如果您只是重複使用視圖,您指定的'findViewById'調用將可以正常工作。儘管如此,ID仍然保留,所以不需要重新設置。 – kabuko 2011-06-14 20:05:55

+0

我的意思是如果我想要一個與'(R.id.this_thing)'相關的視圖,然後用它做一些事情,比如改變可視性或者其他東西,那麼我希望這個視圖和'(R.id .that_thing)'這樣我就可以回收視圖,以便減少對象 – 2011-06-14 20:12:10

1

使用findViewById你試圖找到已經「命名」的視圖,你需要在膨脹佈局後執行一些操作。

使用setId爲視圖設置了一個名稱(例如,它是以編程方式創建的),以便將來能夠通過findViewById查找此視圖。

您可以使用findViewById不僅onCreate。每個ViewGroul允許你通過ID找到他們的孩子。

+0

我想我的意思是說我不能在靜態方法中使用'findViewById',只有'setId'可以工作 – 2011-06-14 19:56:31