9

我刚刚从编译器中看到这条有趣的消息,但我不知道为什么会这样。这是案例

示例 1。

Button test = (Button) findViewById(R.id.someButtonId);
test.setOnClickListener(this);

示例 2。

findViewById(R.id.someButtonId).setOnClickListener(this);

在第一个示例中,我需要将由findViewByIdto返回的对象强制转换Button。在第二个示例中,我不必强制转换返回的对象,因为我没有使用另一个Button类对象。如果我尝试通过

((Button)findViewById(R.id.someButtonId)).setOnClickListener(this);

我会收到警告的Casting findViewById(R.id.someButtonId) to Button is redundant

为什么会这样?我不是要删除演员警告。我想知道这背后的逻辑,以及如果我不尝试使用返回的对象初始化另一个对象,为什么不需要强制转换findViewById

4

5 回答 5

7

你得到这个的原因是因为findViewById返回View并且这个类已经定义了方法setOnClickListener。这意味着即使不进行强制转换,您也可以设置侦听器。因此,您的演员阵容是多余的。

于 2012-03-01T10:40:52.120 回答
2

findViewById()总是返回 View,它是所有 View的父级,例如 ImageView、Button...

setOnClickListener是 View 类的一个方法。因此,您可以简单地捕获点击事件,而无需将其转换为 Button。我认为只有它说多余。

于 2012-03-01T10:40:06.180 回答
2

这样做的原因是,在示例 1 中,您明确需要找到一个 Button,因为您将它分配给一个 Button 变量。

OnClickListener 适用于任何类型的 View,因此您无需将其强制转换为 View 的特定子类即可为其设置 OnClickListener。

于 2012-03-01T10:40:37.723 回答
1

发生这种情况是因为您不需要强制View转换来Button调用. 做就够了setOnClickListenerViewfindViewById(R.id.someButtonId).setOnClickListener(this);

于 2012-03-01T10:40:51.590 回答
0

我猜 setOnClickListener() 是 View 而不是 Button 中的一个方法,所以是的:演员表是多余的。

于 2012-03-01T10:40:27.550 回答