2017-07-04 60 views
75

最近我發現AndroidStudio提醒我刪除一些類的演員。我記得在舊時代,我們必須投下findViewById的結果,但現在沒有必要。不需要投下findViewById的結果嗎?

findViewById的結果仍然是視圖,所以我想知道爲什麼我們不需要強制類?

我找不到任何提及的文件,任何人都可以找到任何文件?

+3

,因爲現在它的' T \t findViewById(int id)'? – Selvin

+0

你需要在視圖類中沒有的任何操作的情況下投射,比如在ImageView的情況下,如果你想使用setImageResource,那麼你需要使用ImageView來投射findViewById –

+0

但是我覺得知道變量類型有點不方便一目瞭然如果刪除了「冗餘」鑄件。 –

回答

134

從API 26開始,findViewById將返回類型用於推理,因此不再需要投射。

舊的定義:

View findViewById(int id) 

新定義:

<T extends View> T findViewById(int id) 

因此,如果您compileSdk至少爲26,這意味着你可以利用這個:)

+0

謝謝,還有一個問題。我無法在sdk manager中找到sdk26的源代碼,請問哪裏可以找到這個新的定義? –

+0

不幸的是,消息還沒有發佈,Android O仍在預覽中。當最終版本將被髮布時,資源也會出現。 –

+2

如果我們刪除了演員陣容,我們的應用仍然可以在較低的設備上運行,對吧? – user1032613

1

Android Studio中的提醒刪除鑄件,如果您使用查看類的常見屬性,如可見或一些常見的方法,如的onClick()

例如:

((ImageView) findViewById(R.id.image_car)).setVisibility(View.VISIBLE); 

在這種情況下,你可以簡單的寫:

findViewById(R.id.image_car).setVisibility(View.VISIBLE); 
+2

你仍然必須聲明類型,你必須寫:findViewById (R.id.image_car).setVisibility(View.VISIBLE); – Slickelito

7

在舊版本:

AutoCompleteTextView name=(AutoCompleteTextView) findViewById(R.id.autoCompleteTextView); 

3.0與sdk 26:

AutoCompleteTextView name = findViewById(R.id.autoCompleteTextView); 
6

根據這一article

以下功能依賴於Java的泛型自動類型推斷,以消除需要人工鑄塑:

protected <T extends View> T findViewById(@IdRes int id) { 
    return (T) getRootView().findViewById(id); 
}