Google Android - это несложно

Добро пожаловать на форум сайта startandroid.ru
Текущее время: 17 июн 2019, 07:45

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 216 ]  На страницу Пред.  1, 2, 3, 4, 5 ... 11  След.
Автор Сообщение
СообщениеДобавлено: 01 авг 2012, 22:13 

Зарегистрирован: 30 янв 2012, 21:15
Сообщений: 21
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
samarjan писал(а):
Тогда получается эмулятор сначала расценивает клик не как по кнопке а как по самому окну Activity а там дальше передает конкретнее что было нажато, верно?

Эмулятор расценивает нажатие кнопки одинаково для всех трех вариантов. Просто в первых двух мы ставим слушателя на кнопки и слушатель вызывает метод, а в третьем варианте сама кнопка вызывает метод (избавляемся от посредника в виде слушателя (OnClickListener)).


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 01 авг 2012, 23:13 

Зарегистрирован: 16 июл 2012, 07:47
Сообщений: 235
Благодарил (а): 0 раз.
Поблагодарили: 25 раз.
Jack_killer писал(а):
samarjan писал(а):
Тогда получается эмулятор сначала расценивает клик не как по кнопке а как по самому окну Activity а там дальше передает конкретнее что было нажато, верно?

Эмулятор расценивает нажатие кнопки одинаково для всех трех вариантов. Просто в первых двух мы ставим слушателя на кнопки и слушатель вызывает метод, а в третьем варианте сама кнопка вызывает метод (избавляемся от посредника в виде слушателя (OnClickListener)).

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 02 авг 2012, 00:04 

Зарегистрирован: 14 май 2012, 16:18
Сообщений: 372
Благодарил (а): 0 раз.
Поблагодарили: 6 раз.
Конечно отражение медленнее, но ведь мы не жмем на кнопки 100500 раз в минуту. Врядли разница будет заметна.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 13 авг 2012, 14:24 

Зарегистрирован: 13 авг 2012, 14:16
Сообщений: 9
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
damager82 писал(а):
Tkas писал(а):
Здравствуйте. А как лучше сделать обработчик: как в этом уроке или через android:onClick="butHello_Click" как в уроке Климова?

Добрый день. Работать будет и так и так. Но через onClick проще, факт )

В результате эксперимента (android 2.2) обратил внимание что кнопка одинаково хорошо реагирует на оба способа, а вот TextView не желает реагировать на клик, если он привязан через android:onClick, но прекрасно реагирует через OnClickListener.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 14 авг 2012, 13:43 

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 14 авг 2012, 17:51 

Зарегистрирован: 16 июл 2012, 07:47
Сообщений: 235
Благодарил (а): 0 раз.
Поблагодарили: 25 раз.
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() ).
Смотри сколько вариантов использования. Как плагин сможет выбрать нужный?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 15 авг 2012, 21:55 

Зарегистрирован: 15 авг 2012, 21:44
Сообщений: 5
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Я тут тоже наткнулся на уроки Климова. Вроде все хорошо и понятно, но зачем он называет методы "butHello_Click". В java некрасиво использовать разные стили названия методов и переменных, тем более правильным считается использовать только верблюжью нотацию, т.е взял бы он и назвал: butHelloClick...


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 16 авг 2012, 20:05 

Зарегистрирован: 13 авг 2012, 14:16
Сообщений: 9
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
dlnsk писал(а):
В результате эксперимента (android 2.2) обратил внимание что кнопка одинаково хорошо реагирует на оба способа, а вот TextView не желает реагировать на клик, если он привязан через android:onClick, но прекрасно реагирует через OnClickListener.

Обнаружли у Климова:
Цитата:
Если вы хотите, чтобы TextView обрабатывал нажатия (атрибут android:onClick), то не забывайте также использовать в связке атрибут android:clickable="true". Иначе работать не будет!

Просто у кнопки Clickable по-умолчанию - истина.
Ну что же - запомним.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 05 сен 2012, 22:50 

Зарегистрирован: 05 сен 2012, 10:15
Сообщений: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Доброго времени суток!
подскажите на какую "пустоту" ругается eclipse в этом месте кода?:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. public void onClick(View v) {
  2.                  // по id определеяем кнопку, вызвавшую этот обработчик
  3.                  switch (v.getId()) {
  4.                  case R.id.btnOk:

void is an invalid type for the variable onClick


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 11 сен 2012, 22:20 

Зарегистрирован: 22 авг 2012, 23:21
Сообщений: 3
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
У меня такая проблема
используя самый простой обработчик
Xml код
Код: [ Загрузить ] [ Скрыть ]
  1. <Button 
  2. android:id="@+id/btnCancel" 
  3. android:layout_width="100dp" 
  4. android:layout_height="wrap_content" 
  5. android:layout_gravity="center_horizontal" 
  6. android:onClick="onClickSrat" 
  7. android:text="Cancel"> 
  8. </Button> 

Java
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. public void onClickStart(View v)
  2.     {
  3.         tvOut.setText("Нажата кнопка Cancel");
  4.     }
  5.  

нажимаю на кнопку и вылетает
что не так?
прошивка 4.03


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 11 сен 2012, 22:45 
Аватар пользователя

Зарегистрирован: 26 июн 2012, 13:22
Сообщений: 3422
Откуда: UA
Благодарил (а): 11 раз.
Поблагодарили: 244 раз.
что хоть вылетает? птичка!?
Учитесь правильно описывать свои проблемы. Так называемый "вылет" может быть от банальной ошибки nullpointerexception до memoryexception и поди гадай из-за чего вылетает. Предоставляйте лог ошибок хотя бы, а лучше с кодом.

_________________
R.id.team
Политика на форуме запрещена


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 11 сен 2012, 23:35 

Зарегистрирован: 14 май 2012, 16:18
Сообщений: 372
Благодарил (а): 0 раз.
Поблагодарили: 6 раз.
android:onClick="onClickSrat"
public void onClickStart(View v)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 06 окт 2012, 22:23 

Зарегистрирован: 05 окт 2012, 21:22
Сообщений: 1
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Здравствуйте, подскажите как сохранять текст, установленный методом setText(), при смене ориентации экрана.
Сейчас получается, что текст становится исходным (который указан в xml-файле)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 09 окт 2012, 16:38 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
john812 писал(а):
Здравствуйте, подскажите как сохранять текст, установленный методом setText(), при смене ориентации экрана.
Сейчас получается, что текст становится исходным (который указан в xml-файле)

Это вам в Урок 70.

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 15 окт 2012, 22:23 

Зарегистрирован: 12 окт 2012, 15:31
Сообщений: 117
Благодарил (а): 3 раз.
Поблагодарили: 0 раз.
Доброго времени суток. Кто-нибудь выложите, пожалуйста, полный код первого метода ( один обработчик для нескольких элементов), а то Эклипс ругается на синтаксис, а я не могу понять в чём ошибка. Спасибо..


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 19 окт 2012, 14:30 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
Digetix писал(а):
Доброго времени суток. Кто-нибудь выложите, пожалуйста, полный код первого метода ( один обработчик для нескольких элементов), а то Эклипс ругается на синтаксис, а я не могу понять в чём ошибка. Спасибо..

Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. package ru.startandroid.develop.listener;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.view.View.OnClickListener;
  7. import android.widget.Button;
  8. import android.widget.TextView;
  9.  
  10. public class MainActivity extends Activity {
  11.  
  12.         TextView tvOut;
  13.         Button btnOk;
  14.         Button btnCancel;
  15.  
  16.         /** Called when the activity is first created. */
  17.         @Override
  18.         public void onCreate(Bundle savedInstanceState) {
  19.                 super.onCreate(savedInstanceState);
  20.                 setContentView(R.layout.main);
  21.                 // найдем View-элементы
  22.                 tvOut = (TextView) findViewById(R.id.tvOut);
  23.                 btnOk = (Button) findViewById(R.id.btnOk);
  24.                 btnCancel = (Button) findViewById(R.id.btnCancel);
  25.  
  26.                 // создание обработчика
  27.                 OnClickListener oclBtn = new OnClickListener() {
  28.                         @Override
  29.                         public void onClick(View v) {
  30.                                 // по id определеяем кнопку, вызвавшую этот обработчик
  31.                                 switch (v.getId()) {
  32.                                 case R.id.btnOk:
  33.                                         // кнопка ОК
  34.                                         tvOut.setText("Нажата кнопка ОК");
  35.                                         break;
  36.                                 case R.id.btnCancel:
  37.                                         // кнопка Cancel
  38.                                         tvOut.setText("Нажата кнопка Cancel");
  39.                                         break;
  40.                                 }
  41.                         }
  42.                 };
  43.  
  44.                 btnOk.setOnClickListener(oclBtn);
  45.                 btnCancel.setOnClickListener(oclBtn);
  46.         }
  47. }
  48.  

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 окт 2012, 12:43 

Зарегистрирован: 15 окт 2012, 11:07
Сообщений: 43
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Я полностью копирую код из поста выше ... и получаю btnCancel cannot be resolved or is not a field (и так по btnOk, tvOut) :(

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

Изображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 окт 2012, 14:06 

Зарегистрирован: 15 окт 2012, 11:07
Сообщений: 43
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Отбой. Непонятно, что это было. Удалил проект и сделал по новой.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 окт 2012, 17:54 

Зарегистрирован: 15 окт 2012, 11:07
Сообщений: 43
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Застрял на самом последнем и походу простом варианте: Самая простая реализация обработчика.

Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2.     xmlns:tools="http://schemas.android.com/tools"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="match_parent" >
  5.  
  6.     <TextView
  7.         android:id="@+id/textView2"
  8.         android:layout_width="wrap_content"
  9.         android:layout_height="wrap_content"
  10.         android:layout_alignParentTop="true"
  11.         android:layout_centerHorizontal="true"
  12.         android:layout_marginTop="52dp"
  13.         android:text="TextView" />
  14.  
  15.     <Button
  16.         android:id="@+id/btnStart"
  17.         android:layout_width="wrap_content"
  18.         android:layout_height="wrap_content"
  19.         android:layout_alignLeft="@+id/textView2"
  20.         android:layout_below="@+id/textView2"
  21.         android:layout_marginTop="29dp"
  22.         android:onClick="onClickStart"
  23.         android:text="Button" />
  24.  
  25. </RelativeLayout>
  26.  


Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. package com.example.buttonclick;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.view.Menu;
  6. import android.view.View;
  7. import android.widget.Button;
  8. import android.widget.TextView;
  9.  
  10. public class MainActivity extends Activity {
  11.  
  12.            TextView tvOut;
  13.            Button btnStart;
  14.     @Override
  15.     public void onCreate(Bundle savedInstanceState) {
  16.         super.onCreate(savedInstanceState);
  17.         setContentView(R.layout.main);}
  18.        
  19.         public void onClickStart(View v) {
  20.             // действия при нажати на кнопку
  21.                  switch (v.getId()) {
  22.              case R.id.btnStart:
  23.                // кнопка ОК
  24.                tvOut.setText("Нажата кнопка ОК");
  25.           }
  26.     }
  27.  
  28.     @Override
  29.     public boolean onCreateOptionsMenu(Menu menu) {
  30.         getMenuInflater().inflate(R.menu.main, menu);
  31.         return true;
  32.     }
  33. }
  34.  


Изображение

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 окт 2012, 18:08 

Зарегистрирован: 14 май 2012, 16:18
Сообщений: 372
Благодарил (а): 0 раз.
Поблагодарили: 6 раз.
У вас не определен объект tvOut
В onCreate после setContentView(R.layout.main); добавьте
tvOut=(TextView) findViewById(R.id.textView2);


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 216 ]  На страницу Пред.  1, 2, 3, 4, 5 ... 11  След.

Часовой пояс: UTC + 3 часа


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB