Эмулятор расценивает нажатие кнопки одинаково для всех трех вариантов. Просто в первых двух мы ставим слушателя на кнопки и слушатель вызывает метод, а в третьем варианте сама кнопка вызывает метод (избавляемся от посредника в виде слушателя (OnClickListener)).samarjan писал(а):Тогда получается эмулятор сначала расценивает клик не как по кнопке а как по самому окну Activity а там дальше передает конкретнее что было нажато, верно?
Урок 10. Оптимизируем реализацию обработчиков.
-
- Сообщения: 21
- Зарегистрирован: 30 янв 2012, 21:15
Re: Урок 10. Оптимизируем реализацию обработчиков.
Re: Урок 10. Оптимизируем реализацию обработчиков.
Если мы ставим слушателя на кнопку, кнопка запоминает указатель на слушателя и при клике вызывает у него метод OnClick() - быстро.Jack_killer писал(а):Эмулятор расценивает нажатие кнопки одинаково для всех трех вариантов. Просто в первых двух мы ставим слушателя на кнопки и слушатель вызывает метод, а в третьем варианте сама кнопка вызывает метод (избавляемся от посредника в виде слушателя (OnClickListener)).samarjan писал(а):Тогда получается эмулятор сначала расценивает клик не как по кнопке а как по самому окну Activity а там дальше передает конкретнее что было нажато, верно?
Если указываем имя метода, кнопке нужно, пользуясь отражением, найти и вызвать метод в классе - намного медленнее, хотя программирование быстрее (не нужно объявлять наследование от интерфейса, вызывать setOnClickListener() и т.д.)
Большой switch по id-ам идёт быстро, если id'ы назначены по порядку, но андроид может назначить их в любом порядке.
Но switch обычно быстрее, чем отражение.
От switch'а можно избавиться, назначив каждому view отдельный слушатель (анонимный класс, вложенный класс или класс в отдельном файле). Но при этом будет дополнительно тратиться память.
Re: Урок 10. Оптимизируем реализацию обработчиков.
Конечно отражение медленнее, но ведь мы не жмем на кнопки 100500 раз в минуту. Врядли разница будет заметна.
Re: Урок 10. Оптимизируем реализацию обработчиков.
В результате эксперимента (android 2.2) обратил внимание что кнопка одинаково хорошо реагирует на оба способа, а вот TextView не желает реагировать на клик, если он привязан через android:onClick, но прекрасно реагирует через OnClickListener.damager82 писал(а):Добрый день. Работать будет и так и так. Но через onClick проще, факт )Tkas писал(а):Здравствуйте. А как лучше сделать обработчик: как в этом уроке или через android:onClick="butHello_Click" как в уроке Климова?
Re: Урок 10. Оптимизируем реализацию обработчиков.
После билдера (и, наверное, многих других IDE) все три способа вызывают жуткое неудобство.
Нет ли плагина, который:
1. Автоматически прописывал бы в коде объявление и инициализацию кидаемых на активити контролов?
2. Автоматически добавлял бы в код шаблон функции (с прописью в xml-файле соответствующего поля) при даблклике на соответствующий пункт в менеджере контрола?
Руками это все набивать - мартышкин труд.
Нет ли плагина, который:
1. Автоматически прописывал бы в коде объявление и инициализацию кидаемых на активити контролов?
2. Автоматически добавлял бы в код шаблон функции (с прописью в xml-файле соответствующего поля) при даблклике на соответствующий пункт в менеджере контрола?
Руками это все набивать - мартышкин труд.
Re: Урок 10. Оптимизируем реализацию обработчиков.
А зачем это нужно? В примерах в onCreate() ищутся виджеты, сброшенные на форму и запоминаются в полях Activity - аналогично тому, как делает Builder - для простоты объяcнения материала. Затем, в обуждении уроков пишут, как это всё можно упростить.nilsman писал(а):После билдера (и, наверное, многих других IDE) все три способа вызывают жуткое неудобство.
Нет ли плагина, который:
1. Автоматически прописывал бы в коде объявление и инициализацию кидаемых на активити контролов?
2. Автоматически добавлял бы в код шаблон функции (с прописью в xml-файле соответствующего поля) при даблклике на соответствующий пункт в менеджере контрола?
Руками это все набивать - мартышкин труд.
В реальном приложении объявления большинства этих контролов не нужны, они только замусоривают объявление класса. А те которые нужны, будут располагаться в месте нужном для программиста - в локальной переменной, в параметре слушателя, в поле вложенного или отдельного класса.
Не забудь, что при повороте экрана все эти виджеты уничтожаются, и их нужно искать заново - а наличие указателей на старые виджеты помешает сборщику мусора удалить их (оператора 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. Оптимизируем реализацию обработчиков.
Я тут тоже наткнулся на уроки Климова. Вроде все хорошо и понятно, но зачем он называет методы "butHello_Click". В java некрасиво использовать разные стили названия методов и переменных, тем более правильным считается использовать только верблюжью нотацию, т.е взял бы он и назвал: butHelloClick...
Re: Урок 10. Оптимизируем реализацию обработчиков.
Обнаружли у Климова:dlnsk писал(а):В результате эксперимента (android 2.2) обратил внимание что кнопка одинаково хорошо реагирует на оба способа, а вот TextView не желает реагировать на клик, если он привязан через android:onClick, но прекрасно реагирует через OnClickListener.
Просто у кнопки Clickable по-умолчанию - истина.Если вы хотите, чтобы TextView обрабатывал нажатия (атрибут android:onClick), то не забывайте также использовать в связке атрибут android:clickable="true". Иначе работать не будет!
Ну что же - запомним.
Re: Урок 10. Оптимизируем реализацию обработчиков.
Доброго времени суток!
подскажите на какую "пустоту" ругается eclipse в этом месте кода?:
void is an invalid type for the variable onClick
подскажите на какую "пустоту" ругается eclipse в этом месте кода?:
Код: Выделить всё
public void onClick(View v) {
// по id определеяем кнопку, вызвавшую этот обработчик
switch (v.getId()) {
case R.id.btnOk:
Re: Урок 10. Оптимизируем реализацию обработчиков.
У меня такая проблема
используя самый простой обработчик
Xml код
Java
нажимаю на кнопку и вылетает
что не так?
прошивка 4.03
используя самый простой обработчик
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>
Код: Выделить всё
public void onClickStart(View v)
{
tvOut.setText("Нажата кнопка Cancel");
}
что не так?
прошивка 4.03
Re: Урок 10. Оптимизируем реализацию обработчиков.
что хоть вылетает? птичка!?
Учитесь правильно описывать свои проблемы. Так называемый "вылет" может быть от банальной ошибки nullpointerexception до memoryexception и поди гадай из-за чего вылетает. Предоставляйте лог ошибок хотя бы, а лучше с кодом.
Учитесь правильно описывать свои проблемы. Так называемый "вылет" может быть от банальной ошибки nullpointerexception до memoryexception и поди гадай из-за чего вылетает. Предоставляйте лог ошибок хотя бы, а лучше с кодом.
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 10. Оптимизируем реализацию обработчиков.
android:onClick="onClickSrat"
public void onClickStart(View v)
public void onClickStart(View v)
Re: Урок 10. Оптимизируем реализацию обработчиков.
Здравствуйте, подскажите как сохранять текст, установленный методом setText(), при смене ориентации экрана.
Сейчас получается, что текст становится исходным (который указан в xml-файле)
Сейчас получается, что текст становится исходным (который указан в xml-файле)
Re: Урок 10. Оптимизируем реализацию обработчиков.
Это вам в Урок 70.john812 писал(а):Здравствуйте, подскажите как сохранять текст, установленный методом setText(), при смене ориентации экрана.
Сейчас получается, что текст становится исходным (который указан в xml-файле)
Re: Урок 10. Оптимизируем реализацию обработчиков.
Доброго времени суток. Кто-нибудь выложите, пожалуйста, полный код первого метода ( один обработчик для нескольких элементов), а то Эклипс ругается на синтаксис, а я не могу понять в чём ошибка. Спасибо..
Re: Урок 10. Оптимизируем реализацию обработчиков.
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. Оптимизируем реализацию обработчиков.
Отбой. Непонятно, что это было. Удалил проект и сделал по новой.
Re: Урок 10. Оптимизируем реализацию обработчиков.
Застрял на самом последнем и походу простом варианте: Самая простая реализация обработчика.
Что я делаю не так?
Код: Выделить всё
<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. Оптимизируем реализацию обработчиков.
У вас не определен объект tvOut
В onCreate после setContentView(R.layout.main); добавьте
tvOut=(TextView) findViewById(R.id.textView2);
В onCreate после setContentView(R.layout.main); добавьте
tvOut=(TextView) findViewById(R.id.textView2);