自从我更新到Android Studio 3.0后,拒绝构建版本APK并抛出lint WrongViewCast
错误。在2.x和以前的版本中没有。
问题是,在违规代码中,findViewById
的结果作为参数传递给期望View
实例的构造函数。由于所有视图都来自View
类,而findViewById
本身返回View
,因此这是一个非常意外的情况。
生成lint WrongViewCast
错误的代码非常基本:
activity_main.xml中
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
/>
</RelativeLayout>
ViewWrapper.java
import android.view.View;
public class ViewWrapper
{
private View contentView;
public ViewWrapper(View content)
{
contentView = content;
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// this line shows WrongViewCast error
ViewWrapper v = new ViewWrapper(findViewById(R.id.text));
}
}
用以下内容替换上面有问题的代码行不会抛出错误
View tv = findViewById(R.id.text);
ViewWrapper v = new ViewWrapper(tv);
当然,使用@SuppressLint("WrongViewCast")
注释或使用
lintOptions {
disable 'WrongViewCast'
}
也可以。
问题是ViewWrapper v = new ViewWrapper(findViewById(R.id.text));
显示错误的原因?是lint中的那个bug还是我遗漏了一些明显的东西?