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

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

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

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

samarjan писал(а):Тогда получается эмулятор сначала расценивает клик не как по кнопке а как по самому окну Activity а там дальше передает конкретнее что было нажато, верно?
Эмулятор расценивает нажатие кнопки одинаково для всех трех вариантов. Просто в первых двух мы ставим слушателя на кнопки и слушатель вызывает метод, а в третьем варианте сама кнопка вызывает метод (избавляемся от посредника в виде слушателя (OnClickListener)).

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

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

Сообщение math64 » 01 авг 2012, 23:13

Jack_killer писал(а):
samarjan писал(а):Тогда получается эмулятор сначала расценивает клик не как по кнопке а как по самому окну Activity а там дальше передает конкретнее что было нажато, верно?
Эмулятор расценивает нажатие кнопки одинаково для всех трех вариантов. Просто в первых двух мы ставим слушателя на кнопки и слушатель вызывает метод, а в третьем варианте сама кнопка вызывает метод (избавляемся от посредника в виде слушателя (OnClickListener)).
Если мы ставим слушателя на кнопку, кнопка запоминает указатель на слушателя и при клике вызывает у него метод OnClick() - быстро.
Если указываем имя метода, кнопке нужно, пользуясь отражением, найти и вызвать метод в классе - намного медленнее, хотя программирование быстрее (не нужно объявлять наследование от интерфейса, вызывать setOnClickListener() и т.д.)
Большой switch по id-ам идёт быстро, если id'ы назначены по порядку, но андроид может назначить их в любом порядке.
Но switch обычно быстрее, чем отражение.
От switch'а можно избавиться, назначив каждому view отдельный слушатель (анонимный класс, вложенный класс или класс в отдельном файле). Но при этом будет дополнительно тратиться память.

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

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

Сообщение AndreyI » 02 авг 2012, 00:04

Конечно отражение медленнее, но ведь мы не жмем на кнопки 100500 раз в минуту. Врядли разница будет заметна.

dlnsk
Сообщения: 9
Зарегистрирован: 13 авг 2012, 14:16

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

Сообщение dlnsk » 13 авг 2012, 14:24

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

nilsman
Сообщения: 1
Зарегистрирован: 14 авг 2012, 12:55

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

Сообщение nilsman » 14 авг 2012, 13:43

После билдера (и, наверное, многих других IDE) все три способа вызывают жуткое неудобство.
Нет ли плагина, который:
1. Автоматически прописывал бы в коде объявление и инициализацию кидаемых на активити контролов?
2. Автоматически добавлял бы в код шаблон функции (с прописью в xml-файле соответствующего поля) при даблклике на соответствующий пункт в менеджере контрола?
Руками это все набивать - мартышкин труд.

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

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

Сообщение math64 » 14 авг 2012, 17:51

nilsman писал(а):После билдера (и, наверное, многих других IDE) все три способа вызывают жуткое неудобство.
Нет ли плагина, который:
1. Автоматически прописывал бы в коде объявление и инициализацию кидаемых на активити контролов?
2. Автоматически добавлял бы в код шаблон функции (с прописью в xml-файле соответствующего поля) при даблклике на соответствующий пункт в менеджере контрола?
Руками это все набивать - мартышкин труд.
А зачем это нужно? В примерах в onCreate() ищутся виджеты, сброшенные на форму и запоминаются в полях Activity - аналогично тому, как делает Builder - для простоты объяcнения материала. Затем, в обуждении уроков пишут, как это всё можно упростить.
В реальном приложении объявления большинства этих контролов не нужны, они только замусоривают объявление класса. А те которые нужны, будут располагаться в месте нужном для программиста - в локальной переменной, в параметре слушателя, в поле вложенного или отдельного класса.
Не забудь, что при повороте экрана все эти виджеты уничтожаются, и их нужно искать заново - а наличие указателей на старые виджеты помешает сборщику мусора удалить их (оператора delete в java нет).
А вот чего действительно неудобно - что id'ы со всех форм собираются в одном классе R.java

Если же тебе нужен такой плагин - теоретически его можно сделать.

Без этого плагина, только для нужных переменных:
В onCreate() (или другом подходящем методе) пишем
fVBI - Ctrl-Enter - раскрывается в findViewById() - вводим R.id. - Ctrl-Enter - появляются подсказки id - вот здесь неудобство, в подсказке все id приложения, а не только нашей формы.
Перед findViewById() пишем (), Ctrl-Enter внутри скобок, из подсказок выыбираем нужный тип.
Не обязательно тот тип, который на форме - можно для ладшафта использовать GridView, а для портрета ListView - тогда выбираем AbsListView - общий абстрактный класс для ListView и GridView.
Вводим перед эти ещё <имя переменной> =
Появляется значок ошибки, по клику на него предложение исправить её: создать локальную переменную или поле класса.
Если переменная нужна только в этом методе - создаём локальную, если нужна в других методах - поле класса.
Если не знаем - тоже выбираем локальную переменную, потом её при необходимости можно сделать полем класса (меню рефакторинг) - замену же поля класса локальной переменной придётся делать в ручную.
Написали метод. Видим что локальная переменная используется только один раз. Встаем на переменную и нажимаем Ctrl-Shift-I. Переменная удаляется и заменяется на вызов функции (в данном случае findViewById() ).
Смотри сколько вариантов использования. Как плагин сможет выбрать нужный?

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

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

Сообщение makcon » 15 авг 2012, 21:55

Я тут тоже наткнулся на уроки Климова. Вроде все хорошо и понятно, но зачем он называет методы "butHello_Click". В java некрасиво использовать разные стили названия методов и переменных, тем более правильным считается использовать только верблюжью нотацию, т.е взял бы он и назвал: butHelloClick...

dlnsk
Сообщения: 9
Зарегистрирован: 13 авг 2012, 14:16

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

Сообщение dlnsk » 16 авг 2012, 20:05

dlnsk писал(а):В результате эксперимента (android 2.2) обратил внимание что кнопка одинаково хорошо реагирует на оба способа, а вот TextView не желает реагировать на клик, если он привязан через android:onClick, но прекрасно реагирует через OnClickListener.
Обнаружли у Климова:
Если вы хотите, чтобы TextView обрабатывал нажатия (атрибут android:onClick), то не забывайте также использовать в связке атрибут android:clickable="true". Иначе работать не будет!
Просто у кнопки Clickable по-умолчанию - истина.
Ну что же - запомним.

pshogg
Сообщения: 6
Зарегистрирован: 05 сен 2012, 10:15

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

Сообщение pshogg » 05 сен 2012, 22:50

Доброго времени суток!
подскажите на какую "пустоту" ругается eclipse в этом месте кода?:

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

public void onClick(View v) {
	         // по id определеяем кнопку, вызвавшую этот обработчик
	         switch (v.getId()) {
	         case R.id.btnOk:
void is an invalid type for the variable onClick

tonych33
Сообщения: 3
Зарегистрирован: 22 авг 2012, 23:21

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

Сообщение tonych33 » 11 сен 2012, 22:20

У меня такая проблема
используя самый простой обработчик
Xml код

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

<Button
 android:id="@+id/btnCancel"
 android:layout_width="100dp"
 android:layout_height="wrap_content"
 android:layout_gravity="center_horizontal"
 android:onClick="onClickSrat"
 android:text="Cancel">
</Button>
Java

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

public void onClickStart(View v)
    {
    	tvOut.setText("Нажата кнопка Cancel");
    }
нажимаю на кнопку и вылетает
что не так?
прошивка 4.03

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

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

Сообщение rezak90 » 11 сен 2012, 22:45

что хоть вылетает? птичка!?
Учитесь правильно описывать свои проблемы. Так называемый "вылет" может быть от банальной ошибки nullpointerexception до memoryexception и поди гадай из-за чего вылетает. Предоставляйте лог ошибок хотя бы, а лучше с кодом.
R.id.team
Политика на форуме запрещена

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

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

Сообщение AndreyI » 11 сен 2012, 23:35

android:onClick="onClickSrat"
public void onClickStart(View v)

john812
Сообщения: 1
Зарегистрирован: 05 окт 2012, 21:22

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

Сообщение john812 » 06 окт 2012, 22:23

Здравствуйте, подскажите как сохранять текст, установленный методом setText(), при смене ориентации экрана.
Сейчас получается, что текст становится исходным (который указан в xml-файле)

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

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

Сообщение damager82 » 09 окт 2012, 16:38

john812 писал(а):Здравствуйте, подскажите как сохранять текст, установленный методом setText(), при смене ориентации экрана.
Сейчас получается, что текст становится исходным (который указан в xml-файле)
Это вам в Урок 70.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Digetix
Сообщения: 117
Зарегистрирован: 12 окт 2012, 15:31

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

Сообщение Digetix » 15 окт 2012, 22:23

Доброго времени суток. Кто-нибудь выложите, пожалуйста, полный код первого метода ( один обработчик для нескольких элементов), а то Эклипс ругается на синтаксис, а я не могу понять в чём ошибка. Спасибо..

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

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

Сообщение damager82 » 19 окт 2012, 14:30

Digetix писал(а):Доброго времени суток. Кто-нибудь выложите, пожалуйста, полный код первого метода ( один обработчик для нескольких элементов), а то Эклипс ругается на синтаксис, а я не могу понять в чём ошибка. Спасибо..

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

package ru.startandroid.develop.listener;

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

public class MainActivity extends Activity {

	TextView tvOut;
	Button btnOk;
	Button btnCancel;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		// найдем View-элементы
		tvOut = (TextView) findViewById(R.id.tvOut);
		btnOk = (Button) findViewById(R.id.btnOk);
		btnCancel = (Button) findViewById(R.id.btnCancel);

		// создание обработчика
		OnClickListener oclBtn = new OnClickListener() {
			@Override
			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;
				}
			}
		};

		btnOk.setOnClickListener(oclBtn);
		btnCancel.setOnClickListener(oclBtn);
	}
}
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

vortex
Сообщения: 43
Зарегистрирован: 15 окт 2012, 11:07

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

Сообщение vortex » 22 окт 2012, 12:43

Я полностью копирую код из поста выше ... и получаю btnCancel cannot be resolved or is not a field (и так по btnOk, tvOut) :(

Кнопки и ТекстВью на форме есть. Айдишники прописаны.

Изображение

vortex
Сообщения: 43
Зарегистрирован: 15 окт 2012, 11:07

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

Сообщение vortex » 22 окт 2012, 14:06

Отбой. Непонятно, что это было. Удалил проект и сделал по новой.

vortex
Сообщения: 43
Зарегистрирован: 15 окт 2012, 11:07

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

Сообщение vortex » 22 окт 2012, 17:54

Застрял на самом последнем и походу простом варианте: Самая простая реализация обработчика.

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

<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" >

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="52dp"
        android:text="TextView" />

    <Button
        android:id="@+id/btnStart"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView2"
        android:layout_below="@+id/textView2"
        android:layout_marginTop="29dp"
        android:onClick="onClickStart"
        android:text="Button" />

</RelativeLayout>

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

package com.example.buttonclick;

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

public class MainActivity extends Activity {

	   TextView tvOut;
	   Button btnStart;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);}
        
        public void onClickStart(View v) {
            // действия при нажати на кнопку
        	 switch (v.getId()) {
             case R.id.btnStart:
               // кнопка ОК
               tvOut.setText("Нажата кнопка ОК");
          }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}
Изображение

Что я делаю не так?

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

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

Сообщение AndreyI » 22 окт 2012, 18:08

У вас не определен объект tvOut
В onCreate после setContentView(R.layout.main); добавьте
tvOut=(TextView) findViewById(R.id.textView2);

Ответить