Урок 10. Оптимизируем реализацию обработчиков.

Обсуждение уроков
Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Урок 10. Оптимизируем реализацию обработчиков.

Сообщение damager82 » 25 авг 2011, 03:00

В этом уроке мы:

- научимся использовать один обработчик для нескольких View-элементов
- научим Activity выступать в качестве обработчика


Click here to read this article!
Последний раз редактировалось damager82 20 июн 2017, 14:56, всего редактировалось 16 раз.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Tkas
Сообщения: 5
Зарегистрирован: 24 янв 2012, 16:55

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение Tkas » 24 янв 2012, 17:09

Здравствуйте. А как лучше сделать обработчик: как в этом уроке или через android:onClick="butHello_Click" как в уроке Климова?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение damager82 » 25 янв 2012, 09:28

Tkas писал(а):Здравствуйте. А как лучше сделать обработчик: как в этом уроке или через android:onClick="butHello_Click" как в уроке Климова?
Добрый день. Работать будет и так и так. Но через onClick проще, факт )
Просто, когда я этот урок делал, я еще не знал про этот метод. Все руки не доходят добавить его в урок.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Tkas
Сообщения: 5
Зарегистрирован: 24 янв 2012, 16:55

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение Tkas » 25 янв 2012, 12:05

damager82 писал(а): Добрый день. Работать будет и так и так. Но через onClick проще, факт )
Просто, когда я этот урок делал, я еще не знал про этот метод. Все руки не доходят добавить его в урок.
Да, так действительно проще) А насчет затрат памяти получается, что оба метода одинаковы?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение damager82 » 26 янв 2012, 14:28

Tkas писал(а):А насчет затрат памяти получается, что оба метода одинаковы?
Да, все равно внутри создается обработчик OnClickListener и дергает метод из атрибута onClick.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Adil
Сообщения: 4
Зарегистрирован: 18 апр 2012, 17:26

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение Adil » 18 апр 2012, 17:46

Tkas писал(а):Здравствуйте. А как лучше сделать обработчик: как в этом уроке или через android:onClick="butHello_Click" как в уроке Климова?
А я считаю, что этот метод надо использовать крайне редко. Пусть лучше обработка событий будет в одном месте, чем разбросать их по вьюшкам.
Это также как и в javascript, плохой тон каждому html тегу приписывать обработчик.

mexo
Сообщения: 8
Зарегистрирован: 26 май 2012, 21:45

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение mexo » 27 май 2012, 19:14

Объясните пожалуйста а есть ли разница каким из трех способов (первый из прошлого урока) писать код ? Или можно пользоваться любым ?

Аватара пользователя
andev
Сообщения: 219
Зарегистрирован: 13 янв 2012, 17:56

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение andev » 27 май 2012, 21:43

Пользоваться можно любым, каким сочтете нужным. Проще указывать метод обработки клика в layout. Правильнее, на мой взгляд, внутри кода, т.к. больший контроль

mexo
Сообщения: 8
Зарегистрирован: 26 май 2012, 21:45

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение mexo » 27 май 2012, 23:58

Спасибо. Так как пока только начал изучать все это дело, буду пользоваться первым. Он мне более понятен и проще запоминать команды.

TheHorse
Сообщения: 5
Зарегистрирован: 21 июн 2012, 15:34

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение TheHorse » 21 июн 2012, 19:20

Рекомендую указать, что последний метод onClick="onclick" - предпочтительней. Так корректней, по умолчанию, с точки зрения общепринятых императивов и "конвенций".

xolostyak_by
Сообщения: 18
Зарегистрирован: 02 июл 2012, 03:16

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение xolostyak_by » 06 июл 2012, 17:31

У меня вопрос немного не по теме урока. Вот есть такой код внутри урока

public void onClick(View v) {
// по id определеяем кнопку, вызвавшую этот обработчик
switch (v.getId()) {
case R.id.btnOk:
// кнопка ОК
tvOut.setText("Нажата кнопка ОК");
break;
case R.id.btnCancel:
// кнопка Cancel
tvOut.setText("Нажата кнопка Cancel");
break;
}
}


С чего надо начать что бы подобные задачи уменить решать? Или не париться изучать Android а остальное по ходу изучится?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение damager82 » 11 июл 2012, 11:00

xolostyak_by писал(а):С чего надо начать что бы подобные задачи уменить решать? Или не париться изучать Android а остальное по ходу изучится?
Если вы о Java, то определенно надо изучить хотя бы азы. Без этого дальше будет очень сложно материалы воспринимать.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

baxxabit
Сообщения: 4
Зарегистрирован: 11 июл 2012, 16:52

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение baxxabit » 11 июл 2012, 16:53

В нашем случае мы будем присваивать один обработчик ОБОИМ кнопкам, а внутри обработчика надо будет определять, какая именно кнопка была нажата.
Обеим же, или я не прав?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение damager82 » 12 июл 2012, 09:34

baxxabit писал(а):В нашем случае мы будем присваивать один обработчик ОБОИМ кнопкам, а внутри обработчика надо будет определять, какая именно кнопка была нажата.
Обеим же, или я не прав?
Правы, спасибо!
Еще и обЕих, а не обОих )) Пофиксил
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Daniil
Сообщения: 25
Зарегистрирован: 15 июл 2012, 13:01

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение Daniil » 18 июл 2012, 14:47

а покажите как выглядит код MainActivity.java на примере 2х кнопок, с применением метода onClick .

у меня вышел вот такой:

Код: Выделить всё

package ru.example.l10_listener;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {
//	private Button btnOk;
//	private Button btnCancel;
	private TextView tvOut;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
     //   btnOk = (Button) findViewById(R.id.btnOk);
    //    btnCancel = (Button) findViewById(R.id.btnCancel);
        tvOut = (TextView) findViewById(R.id.tvOut);
    }

    public void btnOk_Click(View v)	{    	
    	tvOut.setText("Нажата кнопку Ok");
    }
    
    public void btnCancel_Click(View v) {
    	tvOut.setText("Нажата кнопка Cancel");
    }
    
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    
}
это activity_main.xml из layout'a:

Код: Выделить всё

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
android:id="@+id/linearLayout1"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_margin="30dp">
<TextView
android:layout_width="wrap_content"
android:text="TextView"
android:layout_height="wrap_content"
android:id="@+id/tvOut"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="50dp">
</TextView>
<Button
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:id="@+id/btnOk"
android:text="OK"
android:onClick="btnOk_Click"
android:layout_width="100dp">
</Button>
<Button
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:id="@+id/btnCancel"
android:text="Cancel"
android:onClick="btnCancel_Click"
android:layout_width="100dp">
</Button>
</LinearLayout> 

</RelativeLayout>
Мне кажется что можно как-то оптимизировать вот эту часть:

Код: Выделить всё

  public void btnOk_Click(View v)	{    	
    	tvOut.setText("Нажата кнопку Ok");
    }
    
    public void btnCancel_Click(View v) {
    	tvOut.setText("Нажата кнопка Cancel");
    }
используя условные выражения, только не могу что-то сообразить как именно это будет выглядеть, подскажите.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение damager82 » 18 июл 2012, 16:31

Daniil писал(а):Мне кажется что можно как-то оптимизировать вот эту часть:

Код: Выделить всё

  public void btnOk_Click(View v)	{    	
    	tvOut.setText("Нажата кнопку Ok");
    }
    
    public void btnCancel_Click(View v) {
    	tvOut.setText("Нажата кнопка Cancel");
    }
используя условные выражения, только не могу что-то сообразить как именно это будет выглядеть, подскажите.
Для обоих кнопок прописываете один метод в атрибуте android:onClick. А в его реализации в Activity проверяете v.getId() на соответствие ID кнопок.

layout:

Код: Выделить всё

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
             android:onClick="onBtnClick"
            android:text="Button1" />

        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="onBtnClick"
            android:text="Button2" />
Activity:

Код: Выделить всё

	public void onBtnClick(View v) {
		switch (v.getId()) {
		case R.id.button1:
			Log.d("qwe", "button1");
			break;
		case R.id.button2:
			Log.d("qwe", "button2");
			break;			
		}
	}
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Daniil
Сообщения: 25
Зарегистрирован: 15 июл 2012, 13:01

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение Daniil » 18 июл 2012, 18:56

Понял, спасибо, не сообразил что "onBtnClick" -это название метода, в android:onClick="onBtnClick"

samarjan
Сообщения: 27
Зарегистрирован: 01 авг 2012, 13:56

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение samarjan » 01 авг 2012, 14:03

Если использовать второй метод, где используется метод объекта Activity то можно обрабатывать в методе onClick не только кнопки, но и другие компоненты? По-моему самый удобный и универсальный способ

Jack_killer
Сообщения: 21
Зарегистрирован: 30 янв 2012, 21:15

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение Jack_killer » 01 авг 2012, 20:20

samarjan писал(а):Если использовать второй метод, где используется метод объекта Activity то можно обрабатывать в методе onClick не только кнопки, но и другие компоненты? По-моему самый удобный и универсальный способ
ну так ведь можно и в другие компоненты прописывать обработчик onClick, а в методе обрабатывать через swich.

samarjan
Сообщения: 27
Зарегистрирован: 01 авг 2012, 13:56

Re: Урок 10. Оптимизируем реализацию обработчиков.

Сообщение samarjan » 01 авг 2012, 20:28

Тогда получается эмулятор сначала расценивает клик не как по кнопке а как по самому окну Activity а там дальше передает конкретнее что было нажато, верно?
Jack_killer, все равно мне кажется это удобнее и правильнее

Ответить