转换结果findViewById android方法

时间:2014-04-02 08:39:57

标签: android findviewbyid

为什么我们总是要抛出方法findViewById(id)返回的值?该方法已经返回一个视图,正如我在谷歌参考中看到的那样:

http://developer.android.com/reference/android/view/View.html#findViewById(int)

然后是否可以从视图中分离出另一个东西?例如,执行以下操作:

ImageView image = (ImageView) findViewById(R.id.image) ?

5 个答案:

答案 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的任何直接/间接子类的方法,例如ImageViewLinearLayoutTextView,则可以省略强制转换等

View是窗口小部件的基类,用于创建交互式UI组件(按钮,文本字段等)。

当然,您可以转发到View

的任何子类