Android: как обращаться с кнопкой мыши
имея солидный опыт работы в области не Java и не Android, я изучаю Android.
у меня много путаницы с различными областями, одна из них-как обрабатывать нажатия кнопок. Есть по крайней мере 4 способа сделать это (!!!), они кратко перечислены здесь
для обеспечения согласованности я перечислю их:
член
View.OnClickListenerкласс в действии и назначить его экземпляру, который будет обрабатыватьonClickлогика вonCreateспособ деятельности.создайте "onClickListener" в методе действия "onCreate" и назначьте его кнопке с помощью setOnClickListener
реализовать "onClickListener" в самой деятельности и назначить " это " в качестве слушателя для кнопки. В случае, если activity имеет несколько кнопок, идентификатор кнопки должен быть проанализирован для выполнения обработчика "onClick" для соответствующей кнопки
есть открытый метод на действие, реализующее логику "onClick" и назначающее ее кнопке в объявлении XML действия
Вопрос № 1:
- Это все методы, есть ли другой вариант? (Мне не нужны никакие другие, просто любопытно)
для меня самый интуитивный способ был бы последним: он требует наименьшего количества кода для ввода и является наиболее читаемым (по крайней мере для меня).
хотя, я не вижу этот подход используется широко. Какие минусы для его использования?
Вопрос #2:
какие плюсы/минусы для каждого из этих методов? Пожалуйста, поделитесь своим опытом или хорошей ссылкой.
любая обратная связь приветствуется!
P. S. Я уже пыталась погуглить и найти что-то на эту тему, но единственное, что я нашел это описание "как" это сделать, а не почему это хорошо или плохо.
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. Но недостатком я вижу то, что:
- вид сами,
- и любой другой объект, который может быть расположен в 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