【问题标题】:Is this casting to a sub class of ImageView problematic?这种转换为 ImageView 的子类有问题吗?
【发布时间】:2017-10-25 07:17:06
【问题描述】:

所以我有课:

public class NetworkIcon extends ImageView {

public  NetworkIcon (Context c){
    super(c);
}


}

然后我有:

NitroCooledTowerRack = (NetworkIcon)(ImageView)findViewById(R.id.imageView1);

看起来完全多余,对吧?除非我没有在其中放置“(ImageView)”,否则 Android Studio 似乎会将其视为警告(不是错误,它仍然会生成)。

所以我问,这是一个非常糟糕的做法吗?还是我应该忽略它?

【问题讨论】:

  • 警告是什么?
  • "意外投射:布局标签是 imageView"
  • 是的,如果你运行它,你会得到一个ClassCastException。如果你想在你的布局中自定义View,你需要使用一个标签来指定它的确切类:例如,<com.mycompany.myapp.NetworkIcon>。您还需要在该类中至少再添加一个构造函数。
  • 感谢您的回复。 “再一个构造函数”是什么意思?我也可以“发明”xml标签吗?
  • 要允许从布局 XML 进行膨胀,您需要实现一个构造函数,该构造函数采用 ContextAttributeSet,如 here 所示。你并没有真正“发明”它。 LayoutInflater 会将标签名称读取为字符串,然后尝试从中实例化类(如果可以)。如果找不到匹配的类,则会抛出异常。

标签: java android casting


【解决方案1】:

双重转换显然是多余的。从构建工具 v26 开始,您甚至不需要单个演员表。

还要记住,如果 id 为 R.id.imageView1 的视图是 ImageView,则不能将其强制转换为 ImageView 的子类

【讨论】:

  • 如果您将ImageView 转换为它的子类,您将在运行时收到 ClassCastException。 “所有NetworkIcon 都不是ImageView。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 2014-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 2012-04-08
相关资源
最近更新 更多