Android O不再需要使用findViewById进行投射吗?

35

我最近在Android Studio中将我的Android SDK和构建工具更新到API 26,并且我直接注意到当我像这样进行视图转换时,Android Studio会将我的视图强制转换标记为“冗余”:

TextView itemName = (TextView) findViewById(R.id.menuItemName);

经过一些研究,我发现自从SDK 26以后,findViewById使用Java 8功能返回相同的对象类型,但我想知道是否完全安全删除所有转换。这会导致在26之前的Android上出现任何问题吗?如果有更多信息将很有帮助,因为我在互联网上没有找到太多。提前感谢。


这不是答案,只是建议。在旧版本(SDK 26以下),使用以下代码:TextView name=(TextView) findViewById(R.id.TextView); 在SDK 26及以上版本中,请使用以下代码:TextView name= findViewById(R.id.TextView); - Rajesh Naddy
1个回答

42
方法签名已更改,如您所见,现在它看起来像这样:
public <T extends View> T findViewById(int id);

相对于旧版(SDK 26之前):

public View findViewById(int id);

只要您使用SDK 26(或更高版本)来编译项目,就可以安全地从代码中删除强制转换,因为您将使用新的findViewById(),它不再需要强制转换。
“那么,如果minSdk低于26,会有问题吗?”
不会,minSdk和targetSdk都不重要。重要的是compileSdk必须是26或更高版本。

3
那么,minSdk版本低于26不会引起问题吗?你能解释一下为什么支持库在其中扮演了角色吗?在Android 26之前的版本中,支持库是否自己管理转换? 答案:低于26的minSdk版本不会引起问题。支持库在此过程中发挥作用,因为它可以处理早期版本的Android中可能出现的问题,例如自动类型转换。因此,在Android 26之前的版本中,支持库可以为您管理类型转换。 - Amr El Aswar
1
基本上,Android支持库使您能够更轻松地实现新功能,而无需检查设备运行的SDK版本。 您可以在此处了解更多信息:https://developer.android.com/topic/libraries/support-library/index.html - Hugo sama
4
不需要支持库,只需使用SDK 26编译即可。 - ianhanniballake
@ianhanniballake,那正是我所想的,sdk 26中的View类是发生了变化的,似乎与支持库无关,所以我想问为什么需要支持库。 - Amr El Aswar
这是不是意味着在SDK 26中使用了反射?还是Java 7/8可以自动进行类型转换?我感到困惑。 - soshial
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接