Кастинг для кнопки лишний – почему?

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

Пример 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 .

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

Функция findViewById () всегда возвращает вид, являющийся родителем всех представлений, таких как ImageView, Button …

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

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

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

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

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

Intereting Posts
<Select> не работает в приложении Phonegap на Android 2.3.3 Android: как я могу сохранить, очистить, а затем восстановить общие настройки для модульного тестирования? XML против setImageDrawable / setImageBitmap Android: MapView не распознает клики Генератор greenDAO дает ошибку консоли, которая не имеет смысла Как добавить изображение (слева) и текст на кнопке Ошибка, связанная с libgcc.a при кросс-компиляции для Android, но существуют символы? Href не работает, как перенаправить на определенную страницу в PhoneGap? Записать весь экран, включая предварительный просмотр камеры Можно создать ToggleButton без текста? GetActivity () возвращает null в PreferenceFragment Java.lang.NoClassDefFoundError: android.support.v7.app.AppCompatDelegateImplV14 в Xamarin Android Прозрачный StatusBar с динамическим цветом ActionBar в Android Метод Onstop вызывается при изменении ориентации Каковы лучшие практики для разработки приложений с использованием Titanium Framework, ориентированного на iPhone и Android?