2017-07-04 61 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); 
}