Метод Java требует аргумента, даже если он не используется

Итак, я возился с Android Studio, и у меня есть метод, который выглядит так:

public void check(View view) {
        EditText numberEditText = findViewById(R.id.number);
        int number = Integer.parseInt(numberEditText.getText().toString());
        Toast.makeText(this, getMessage(number), Toast.LENGTH_SHORT).show();
    }

Метод вызывается при нажатии кнопки и работает должным образом. Однако, когда я удаляю аргумент из метода, оставляя

public void check() {
        EditText numberEditText = findViewById(R.id.number);
        int number = Integer.parseInt(numberEditText.getText().toString());
        Toast.makeText(this, getMessage(number), Toast.LENGTH_SHORT).show();
    },

приложение вылетает при нажатии кнопки. Мне это кажется странным, поскольку я фактически не использую передаваемый View. Я предполагаю, что это какая-то проблема с передачей View, и я не принимаю никаких аргументов. Есть ли способ обойтись взятием View в методе? Я думаю, что это затрудняет чтение кода, когда метод принимает аргумент, который он не использует.

Вот трассировка стека:

08-08 19:37:55.120 11217-11217/com.example.corfi.numbershapes E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.corfi.numbershapes, PID: 11217
    java.lang.IllegalStateException: Could not find method check(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatButton with id 'button3'
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:424)
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:381)
        at android.view.View.performClick(View.java:6597)
        at android.view.View.performClickInternal(View.java:6574)
        at android.view.View.access$3100(View.java:778)
        at android.view.View$PerformClick.run(View.java:25885)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

Заранее благодарю за любую помощь!

не могли бы вы интегрировать свой вопрос, добавив трассировку стека ошибки?

TheOni 08.08.2018 21:44

Я добавил это выше.

Christoffer Corfield Aakre 08.08.2018 21:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
105
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы реализовали прослушиватель кликов через макет xml, в котором вы установили

android:onClick = "click"

Теперь из-за этого ожидаемая функция прослушивателя кликов

public void click(View view){}

Контроллер Android передал представление этому действию при нажатии кнопки, и, таким образом, система узнает, что было нажато.

Альтернативой этому является не добавление слушателя внутри макета и добавление слушателя в ваш код.

удалите часть android: onClick из макета xml

Затем в своем коде сначала найдите вид кнопки

Button yourbutton =  findViewById('R.id.yourbuttonid');

Теперь установите прослушиватель кликов на этом

yourbutton.setOnClickListener(new View.OnClickListener(){

        @Override
        public void onClick(View v) {
          //Do your thing
        }

});

Даже здесь вы можете видеть, что внутренний метод прошел View. Это по дизайну

Вам нужно ссылаться на представление в параметре, потому что это то, как работает Android, чтобы найти слушателя компонента представления.

Если вы посмотрите документация, стандартный метод также поместит view в параметр, как этот блок кода:

public class MyActivity extends Activity {
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);

         setContentView(R.layout.content_layout_id);

         final Button button = findViewById(R.id.button_id);
         button.setOnClickListener(new View.OnClickListener() {

             // On click method has parameter View v
             public void onClick(View v) {
                 // Code here executes on main thread after user presses button
             }
         });
     }
 }

Просмотр будет доставлен для каждого случая вашего слушателя, если вы хотите удалить анонимных слушателей и параметр просмотра, вы можете попробовать Нож для масла, вы можете использовать его, как показано ниже

@OnClick(R.id.yourButtonId)
public void onYourButtonClick(){
    //your logic
} 

Другие вопросы по теме