Android: как обращаться с кнопкой мыши



имея солидный опыт работы в области не Java и не Android, я изучаю Android.



у меня много путаницы с различными областями, одна из них-как обрабатывать нажатия кнопок. Есть по крайней мере 4 способа сделать это (!!!), они кратко перечислены здесь



для обеспечения согласованности я перечислю их:




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


  2. создайте "onClickListener" в методе действия "onCreate" и назначьте его кнопке с помощью setOnClickListener


  3. реализовать "onClickListener" в самой деятельности и назначить " это " в качестве слушателя для кнопки. В случае, если activity имеет несколько кнопок, идентификатор кнопки должен быть проанализирован для выполнения обработчика "onClick" для соответствующей кнопки


  4. есть открытый метод на действие, реализующее логику "onClick" и назначающее ее кнопке в объявлении XML действия



Вопрос № 1:



- Это все методы, есть ли другой вариант? (Мне не нужны никакие другие, просто любопытно)



для меня самый интуитивный способ был бы последним: он требует наименьшего количества кода для ввода и является наиболее читаемым (по крайней мере для меня).



хотя, я не вижу этот подход используется широко. Какие минусы для его использования?



Вопрос #2:



какие плюсы/минусы для каждого из этих методов? Пожалуйста, поделитесь своим опытом или хорошей ссылкой.



любая обратная связь приветствуется!



P. S. Я уже пыталась погуглить и найти что-то на эту тему, но единственное, что я нашел это описание "как" это сделать, а не почему это хорошо или плохо.

444   10  

10 ответов:

Вопрос 1: К сожалению, тот, в котором вы говорите, является наиболее интуитивным, наименее используется в Android. Как я понимаю, вы должны отделить свой пользовательский интерфейс (XML) и вычислительную функциональность (файлы классов Java). Это также облегчает отладку. Это на самом деле намного проще читать таким образом и думать о Android imo.

Вопрос 2: Я считаю, что два в основном используются № 2 и № 3. Я буду использовать кнопку clickButton в качестве примера.

2

в форме из анонимного класса.

Button clickButton = (Button) findViewById(R.id.clickButton);
clickButton.setOnClickListener( new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                ***Do what you want with the click here***
            }
        });

Это мой любимый, так как он имеет метод onClick рядом с тем, где переменная button была установлена с помощью findViewById. Кажется очень аккуратным и аккуратным, что все, что связано с этим видом кнопки clickButton, находится здесь.

con, который комментирует мой коллега, заключается в том, что у вас есть много представлений, которые нуждаются в слушателе onclick. Вы можете видеть, что ваш onCreate будет очень длинным в длину. Так вот почему он любит использование:

3

скажем, у вас есть, 5 кнопок:

убедитесь, что ваша деятельность/фрагмент реализации OnClickListener

// in OnCreate

Button mClickButton1 = (Button)findViewById(R.id.clickButton1);
mClickButton1.setOnClickListener(this);
Button mClickButton2 = (Button)findViewById(R.id.clickButton2);
mClickButton2.setOnClickListener(this);
Button mClickButton3 = (Button)findViewById(R.id.clickButton3);
mClickButton3.setOnClickListener(this);
Button mClickButton4 = (Button)findViewById(R.id.clickButton4);
mClickButton4.setOnClickListener(this);
Button mClickButton5 = (Button)findViewById(R.id.clickButton5);
mClickButton5.setOnClickListener(this);


// somewhere else in your code

public void onClick(View v) {
    switch (v.getId()) {
        case  R.id.clickButton1: {
            // do something for button 1 click
            break;
        }

        case R.id.clickButton2: {
            // do something for button 2 click
            break;
        }

        //.... etc
    }
}

этот способ, как объясняет мой коллега, более аккуратен в его глазах, поскольку все вычисления onClick обрабатываются в одном месте и не переполняют метод onCreate. Но недостатком я вижу то, что:

  1. вид сами,
  2. и любой другой объект, который может быть расположен в onCreate используется метод onClick должен быть внесен в поле.

Дайте мне знать, если вы хотите получить дополнительную информацию. Я не ответил на твой вопрос полностью, потому что это довольно длинный вопрос. И если я найду некоторые сайты, я расширю свой ответ, прямо сейчас я просто даю некоторый опыт.

#1 Я часто использую последний, когда на макете есть кнопки, которые не генерируются (но, очевидно, статичны).

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

для архивирования какой - то безопасности времени компиляции с этим подходом, посмотрите Android Lint (пример).


#2 плюсы и минусы все методы почти одинаковы и урок должен быть:

используйте то, что когда-либо является наиболее подходящим или наиболее интуитивно понятным для вас.

если вы должны назначить то же самое OnClickListener для нескольких экземпляров кнопок сохраните его в области класса (#1). Если вам нужен простой слушатель для кнопки, сделайте анонимный реализация:

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // Take action.
    }
});

Я, как правило, не реализовать OnClickListener в действии это время от времени становится немного запутанным (особенно когда вы реализуете несколько других обработчиков событий, и никто не знает, что this - Это все делает).

Я предпочитаю вариант 4, но это имеет интуитивный смысл для меня, потому что я делаю слишком много работы в Grails, Groovy и JavaFX. "Магические" связи между представлением и контроллером являются общими для всех. Важно хорошо назвать метод:

в представлении добавьте метод onClick к кнопке или другому виджету:

    android:clickable="true"
    android:onClick="onButtonClickCancel"

затем в классе обработайте метод:

public void onButtonClickCancel(View view) {
    Toast.makeText(this, "Cancel pressed", Toast.LENGTH_LONG).show();
}

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

одно большое преимущество заключается в том, что теперь вы можете писать модульные тесты для метода. Вариант 1 может это сделать, но 2 и 3 сложнее.

наиболее часто используемый способ-анонимное объявление

    Button send = (Button) findViewById(R.id.buttonSend);
    send.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // handle click
        }
    });

также вы можете создать вид.Onclicklistener объект и установить его на кнопку позже, но вам все равно нужно переопределить метод onClick например

View.OnClickListener listener = new View.OnClickListener(){
     @Override
        public void onClick(View v) {
            // handle click
        }
}   
Button send = (Button) findViewById(R.id.buttonSend);
send.setOnClickListener(listener);

когда ваша активность реализует интерфейс OnClickListener, вы должны переопределить метод onClick(View v) на уровне активности. Затем вы можете определить это действие как прослушиватель кнопки, потому что он уже реализует интерфейс и переопределяет onClick() метод

public class MyActivity extends Activity implements View.OnClickListener{


    @Override
    public void onClick(View v) {
        // handle click
    }


    @Override
    public void onCreate(Bundle b) {
        Button send = (Button) findViewById(R.id.buttonSend);
        send.setOnClickListener(this);
    }

}

(imho) 4-й подход используется, когда несколько кнопок имеют один и тот же обработчик, и вы можете объявить один метод в классе activity и назначить этот метод нескольким кнопкам в XML-макете, также вы можете создать один метод для одной кнопки, но в этом случае я предпочитаю чтобы объявить обработчики внутри класса activity.

Вариант 1 и 2 включает в себя использование внутреннего класса, который сделает код своего рода беспорядок. Вариант 2 - это своего рода беспорядок, потому что для каждой кнопки будет один слушатель. Если у вас есть небольшое количество кнопок, это нормально. Для варианта 4 я думаю, что это будет сложнее отлаживать, так как вам придется вернуться и в-четвертых xml и java-код. Лично я использую вариант 3 когда мне приходится обрабатывать несколько нажатий кнопки.

мой образец, протестированный в Android studio 2.1

определить кнопку в XML-макете

<Button
    android:id="@+id/btn1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

Java pulsation detect

Button clickButton = (Button) findViewById(R.id.btn1);
if (clickButton != null) {
    clickButton.setOnClickListener( new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            /***Do what you want with the click here***/
        }
    });
}

чтобы сделать вещи проще asp Вопрос 2 заявил, Вы можете использовать лямбда-метод, как это, чтобы сохранить переменную память и избежать навигации вверх и вниз в вашем классе представления

//method 1
findViewById(R.id.buttonSend).setOnClickListener(v -> {
          // handle click
});

но если вы хотите использовать событие click для кнопки одновременно в способ.

Вы можете использовать Вопрос 3 по @D. Tran ответ. Но не забудьте реализовать свой класс представления с помощью View.OnClickListener.

в другом использовать Вопрос #3 Правильно

Вопрос№1-это единственный способ обработки кликов просмотра.

Вопрос № 2 -
Вариант№1 / Вариант№4 - нет большой разницы между вариантом № 1 и вариантом № 4. Единственное различие, которое я вижу, заключается в том, что в одном случае activity реализует OnClickListener, тогда как в другом случае будет анонимная реализация.

опция#2-в этом методе будет создан анонимный класс. Этот метод немного громоздкий, так как вам нужно будет сделать это несколько раз, если у вас есть несколько кнопок. Для анонимных классов вы должны быть осторожны при обработке утечек памяти.

Вариант № 3, хотя, это простой способ. Обычно программисты стараются не использовать какой-либо метод, пока не напишут его, и поэтому этот метод не используется широко. Вы увидите, что в основном люди используют вариант№4. Потому что это чище с точки зрения кода.

есть и доступные варианты в виде различных библиотек, которые могут сделать этот процесс очень знакомым людям, которые использовали другие платформы MVVM.

https://developer.android.com/topic/libraries/data-binding/

показывает пример официальной библиотеки, которая позволяет привязывать кнопки следующим образом:

<Button
    android:text="Start second activity"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:onClick="@{() -> presenter.showList()}"
/>

Шаг 1: Создайте XML-файл:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/btnClickEvent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click Me" />
</LinearLayout>

Шаг 2: Создать MainActivity:

package com.scancode.acutesoft.telephonymanagerapp;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity implements View.OnClickListener {

    Button btnClickEvent;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnClickEvent = (Button) findViewById(R.id.btnClickEvent);
        btnClickEvent.setOnClickListener(MainActivity.this);

    }

    @Override
    public void onClick(View v) {
        //Your Logic
    }
}

HappyCoding!

Comments

    Ничего не найдено.