9

コンパイラからのこの興味深いメッセージに出くわしましたが、なぜそれが起こっているのかわかりません。ケースはこちら

例 1。

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

例 2。

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

最初の例では、によって返されたオブジェクトを to にキャストする必要がありfindViewByIdますButtonButton2 番目の例では、別のクラス オブジェクトを使用していないため、返されたオブジェクトをキャストする必要はありません。経由でキャストしようとすると

((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

この理由は、例 1 では Button 変数に割り当てているため、明示的に Button を見つける必要があるためです。

OnClickListener は任意のタイプの View 用であるため、OnClickListener を設定するために View の特定のサブクラスにキャストする必要はありません。

于 2012-03-01T10:40:37.723 に答える
2

findViewById ()は常に、ImageView、Button などのすべてのビューの親であるビューを返します...

setOnClickListenerは View クラスのメソッドです。そのため、クリック イベントを Button にキャストせずに簡単にキャッチできます。それだけが冗長と言うように思います。

于 2012-03-01T10:40:06.180 に答える
1

で定義されているを呼び出すためにキャストViewする必要がないために発生しています。やれば十分ButtonsetOnClickListenerViewfindViewById(R.id.someButtonId).setOnClickListener(this);

于 2012-03-01T10:40:51.590 に答える
0

setOnClickListener() はボタンではなくビューのメソッドであると推測しているので、キャストは冗長です。

于 2012-03-01T10:40:27.550 に答える