最近我发现AndroidStudio提醒我删除一些类的演员。我记得在旧时代,我们必须投下findViewById的结果,但现在没有必要。不需要投下findViewById的结果吗?
findViewById的结果仍然是视图,所以我想知道为什么我们不需要强制类?
我找不到任何提及的文件,任何人都可以找到任何文件?
最近我发现AndroidStudio提醒我删除一些类的演员。我记得在旧时代,我们必须投下findViewById的结果,但现在没有必要。不需要投下findViewById的结果吗?
findViewById的结果仍然是视图,所以我想知道为什么我们不需要强制类?
我找不到任何提及的文件,任何人都可以找到任何文件?
从API 26开始,findViewById
将返回类型用于推理,因此不再需要投射。
旧的定义:
View findViewById(int id)
新定义:
<T extends View> T findViewById(int id)
因此,如果您compileSdk
至少为26,这意味着你可以利用这个:)
谢谢,还有一个问题。我无法在sdk manager中找到sdk26的源代码,请问哪里可以找到这个新的定义? –
不幸的是,消息还没有发布,Android O仍在预览中。当最终版本将被发布时,资源也会出现。 –
如果我们删除了演员阵容,我们的应用仍然可以在较低的设备上运行,对吧? – user1032613
Android Studio中的提醒删除铸件,如果您使用查看类的常见属性,如可见或一些常见的方法,如的onClick()
例如:
((ImageView) findViewById(R.id.image_car)).setVisibility(View.VISIBLE);
在这种情况下,你可以简单的写:
findViewById(R.id.image_car).setVisibility(View.VISIBLE);
你仍然必须声明类型,你必须写:findViewById
在旧版本:
AutoCompleteTextView name=(AutoCompleteTextView) findViewById(R.id.autoCompleteTextView);
3.0与sdk 26:
AutoCompleteTextView name = findViewById(R.id.autoCompleteTextView);
根据这一article:
以下功能依赖于Java的泛型自动类型推断,以消除需要人工铸塑:
protected <T extends View> T findViewById(@IdRes int id) {
return (T) getRootView().findViewById(id);
}
,因为现在它的' T \t findViewById(int id)'? –
Selvin
你需要在视图类中没有的任何操作的情况下投射,比如在ImageView的情况下,如果你想使用setImageResource,那么你需要使用ImageView来投射findViewById –
但是我觉得知道变量类型有点不方便一目了然如果删除了“冗余”铸件。 –