为什么我们总是要抛出方法findViewById(id)
返回的值?该方法已经返回一个视图,正如我在谷歌参考中看到的那样:
http://developer.android.com/reference/android/view/View.html#findViewById(int)
然后是否可以从视图中分离出另一个东西?例如,执行以下操作:
ImageView image = (ImageView) findViewById(R.id.image) ?
答案 0 :(得分:15)
我总是定义一个方法,在我的基本活动中为我做演员:
@SuppressWarnings("unchecked")
public <T extends View> T $(int id) {
return (T) findViewById(id);
}
这意味着代替:
Button btn = (Button)findViewById(R.id.btn);
你可以这样做:
Button btn = $(R.id.btn);
答案 1 :(得分:2)
方法findViewById()
返回实际用于在XML文件中定义该视图的类的实例。方法签名返回View
以使其通用并可用于继承View
的所有类。
您需要将返回的值强制转换为在您使用它时定义变量的类:
ImageView image = (ImageView) findViewById(R.id.image);
Java不会暗中为你投射。
您可以将其保留为:
View image = findViewById(R.id.image);
但您无法使用ImageView
类定义的方法等。
答案 2 :(得分:1)
View
是其他视图类的常见超类,例如ImageView
。在面向对象的多态中,您可以替换特定的实例,例如ImageView
与超类。这在通用API中很有用,例如findViewById()
返回值。
在Java中向下转换为更具体的类型需要显式转换。
答案 3 :(得分:1)
当我们需要使用与这些类型的视图相关的某些属性时,我们将它转换为特定视图,如ImageView或TextView。例如,您将使用
ImageView image = (ImageView) findViewById(R.id.image);
然后使用image
显式设置ImageView的某些属性。例如,
image.setImageBitmap();
image.setImageAlpha();
之类的。 当您不需要为视图使用任何特定属性时,则无需进行强制转换。例如,在Android中,任何视图都可以设置为可见,消失或不可见。在这种情况下,不需要类型铸造。即便如下也行。
View image = findViewById(R.id.image);
image.setVisibility(View.VISIBLE);
答案 4 :(得分:0)
是的,findViewById()
会返回View
。如果您不需要使用扩展View
的任何直接/间接子类的方法,例如ImageView
,LinearLayout
,TextView
,则可以省略强制转换等
View
是窗口小部件的基类,用于创建交互式UI组件(按钮,文本字段等)。
当然,您可以转发到View