Страница 2 из 11

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

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

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

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

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

Добавлено: 02 авг 2012, 00:04
AndreyI
Конечно отражение медленнее, но ведь мы не жмем на кнопки 100500 раз в минуту. Врядли разница будет заметна.

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

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

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

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

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

Добавлено: 14 авг 2012, 17:51
math64
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() ).
Смотри сколько вариантов использования. Как плагин сможет выбрать нужный?

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

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

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

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

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

Добавлено: 05 сен 2012, 22:50
pshogg
Доброго времени суток!
подскажите на какую "пустоту" ругается eclipse в этом месте кода?:

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

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

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

Добавлено: 11 сен 2012, 22:20
tonych33
У меня такая проблема
используя самый простой обработчик
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

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

Добавлено: 11 сен 2012, 22:45
rezak90
что хоть вылетает? птичка!?
Учитесь правильно описывать свои проблемы. Так называемый "вылет" может быть от банальной ошибки nullpointerexception до memoryexception и поди гадай из-за чего вылетает. Предоставляйте лог ошибок хотя бы, а лучше с кодом.

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

Добавлено: 11 сен 2012, 23:35
AndreyI
android:onClick="onClickSrat"
public void onClickStart(View v)

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

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

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

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

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

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

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

Добавлено: 19 окт 2012, 14:30
damager82
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);
	}
}

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

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

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

Изображение

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

Добавлено: 22 окт 2012, 14:06
vortex
Отбой. Непонятно, что это было. Удалил проект и сделал по новой.

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

Добавлено: 22 окт 2012, 17:54
vortex
Застрял на самом последнем и походу простом варианте: Самая простая реализация обработчика.

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

<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;
    }
}
Изображение

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

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

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