Приведение к кнопке излишне - почему? - PullRequest
8 голосов
/ 01 марта 2012

Я только что натолкнулся на это интересное сообщение от компилятора, и я не знаю, почему это происходит. Вот случай

Пример 1.

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

Пример 2.

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

В первом примере мне нужно привести объект, возвращенный от findViewById к Button. Во втором примере мне не нужно приводить возвращаемый объект, потому что я не использовал другой объект класса Button. Если я попытаюсь разыграть его через

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

Я получу предупреждение Casting findViewById(R.id.someButtonId) to Button is redundant.

Почему это происходит? Я не пытаюсь убрать предупреждение. Я хочу знать логику этого и почему приведение не нужно, если я не пытаюсь инициализировать другой объект с объектом, возвращаемым findViewById.

Ответы [ 5 ]

7 голосов
/ 01 марта 2012

Причина, по которой вы получаете это, заключается в том, что findViewById возвращает View, и этот класс уже определяет метод setOnClickListener. Это означает, что даже не выполняя приведение, вы можете установить слушателя. Таким образом, ваш актерский состав избыточен.

2 голосов
/ 01 марта 2012

Причина этого в том, что в примере 1 вам явно нужно найти кнопку Button, поскольку вы назначаете ее переменной Button.

OnClickListener предназначен для любого типа представления, поэтому вам не нужноприведите его к определенному подклассу View, чтобы установить для него OnClickListener.

2 голосов
/ 01 марта 2012

findViewById () всегда возвращает View, который является родителем всех видов, таких как ImageView, Button ...

setOnClickListener является методом класса View. Таким образом, вы можете отлавливать события нажатия, просто не передавая их кнопке. Я так думаю, что только это говорит избыточно.

1 голос
/ 01 марта 2012

Это происходит потому, что вам не нужно приводить View к Button для вызова setOnClickListener, который определен в View.Достаточно сделать findViewById(R.id.someButtonId).setOnClickListener(this);

0 голосов
/ 01 марта 2012

Я предполагаю, что setOnClickListener () - это метод в представлении, а не в кнопке, и так: да: приведение является избыточным.

...