Урок 14. Меню, группы, порядок. MenuInflater и xml-меню.

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

Re: Урок 14. Меню, группы, порядок. MenuInflater и xml-меню.

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

Xroft то что вы хотите это один из паттернов андроида который называется ActionBar. Но я бы не рекомендовал делать именно то как Вы хотите, а именно в стиле винды. Стиль винды это его стиль, у андроида (как и любой другой ОС) есть своя концепция на счёт внешнего вида. Соответственно там немножко по другому выглядит. Для ознакомления рекомендую прочитать концепцию гугла по андроиду: http://developer.android.com/design/index.html .
Но если Вы пишите приложения только для личного пользования, то "говнокодить" ещё никто не запрещал ;)
На счёт ActionBar'a добавлю что можно реализовывать его вручную (что гораздо приятнее), а так же можно воспользоваться известной библиотекой actionbarsherlock но она не даст полного понимания о паттернах (зато красивые вещи можно будет делать).
R.id.team
Политика на форуме запрещена

Аватара пользователя
Xroft
Сообщения: 38
Зарегистрирован: 10 май 2012, 10:11

Re: Урок 14. Меню, группы, порядок. MenuInflater и xml-меню.

Сообщение Xroft » 11 сен 2012, 22:12

rezak90 писал(а):Xroft
Но если Вы пишите приложения только для личного пользования, то "говнокодить" ещё никто не запрещал ;)
.
Вот как раз говнокодить как раз и нехочется :lol: :lol: :lol: . Все равно потом прийдется "для людей" переделывать :lol:

Сравнение с виндой это просто пример что я хочу, а именно:
1. Отображение одной и той же XML области (например просто кнопки с переходом в другие активити, например "Заказы", "Клиенты", "Выход" и т.д.) на всех активити, которые необходимо ... это мне уже объяснили как ...

2. Создать 1 класс обработки нажатия на пункты(кнопки) "меню" и просто прикручивать этот класс ко всем активити, где будет это нужно (т. е. не переписывать постоянно код обработки нажатий).

Может это дико звучит ... но лучше меня тут 10 раз обзовут говнокодером и помогут направить на путь истинный, чем я буду это действительно "ГОВНОКОДИТЬ" сам :lol: :lol:

Заранее спасибо

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

Re: Урок 14. Меню, группы, порядок. MenuInflater и xml-меню.

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

все мы время от времени "говнокодим" =)
а на счёт вашей проблемы я повторюсь, это всё реализовывает ActionBar. Вкратце: делаете для него разметку, строите класс для это разметки и всё, это полноценный View-компонент который подключаете ко всем активити.
R.id.team
Политика на форуме запрещена

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

Re: Урок 14. Меню, группы, порядок. MenuInflater и xml-меню.

Сообщение AndreyI » 11 сен 2012, 22:54

Дело в том, что все что отображается на экране, т.е. все виджеты, унаследованы от класса View и привязываются к контексту своего Activity это происходит, когда вы выполняете метод setContentView в onCreate соответствующей Activity.
Поэтому если вы будете вставлять в разметку xml другую разметку вовсе не означает, что можно будет назначить один обработчик на все элементы вставляемой разметки. Для каждой Activity будут свои экземпляры этих элементов и определять обработчики для них придется в каждой Activity как не крути. Так что сэкономить здесь врядли получится.

Аватара пользователя
Xroft
Сообщения: 38
Зарегистрирован: 10 май 2012, 10:11

Re: Урок 14. Меню, группы, порядок. MenuInflater и xml-меню.

Сообщение Xroft » 11 сен 2012, 22:59

Ребята, спасибо огромное за подсказки. И отдельное спасибо за оперативность.
Теперь я знаю куда рыть!:)
Будем говнокодить, :lol: :lol: а главное в правильном направлении:)

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

Re: Урок 14. Меню, группы, порядок. MenuInflater и xml-меню.

Сообщение rezak90 » 11 сен 2012, 23:19

AndreyI писал(а):Дело в том, что все что отображается на экране, т.е. все виджеты, унаследованы от класса View и привязываются к контексту своего Activity это происходит, когда вы выполняете метод setContentView в onCreate соответствующей Activity.
Поэтому если вы будете вставлять в разметку xml другую разметку вовсе не означает, что можно будет назначить один обработчик на все элементы вставляемой разметки. Для каждой Activity будут свои экземпляры этих элементов и определять обработчики для них придется в каждой Activity как не крути. Так что сэкономить здесь врядли получится.
Как раз получится. Я просто сейчас разбираюсь с ActionBar'ом. Вкратце опишу как это выглядит, например есть у вас на баре две кнопки, и в каждом активити ихние обработчики реализованы по разному:

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

public class ActionBar extends LinearLayout {
// ...
	private ImageView homeLogo;
	private Button btnOne, btnTwo;
// ...
	public void setHomeLogo(int resId, OnClickListener onClickListener) {
		homeLogo.setImageResource(resId);
		homeLogo.setVisibility(View.VISIBLE);
		if(onClickListener != null)
			homeLogo.setOnClickListener(onClickListener);
	}
	public void setBtnOne(int resId, OnClickListener onClickListener) {
		btnOne.setImageResource(resId);
		btnOne.setVisibility(View.VISIBLE);
		if(onClickListener != null)
			btnOne.setOnClickListener(onClickListener);
	}
// ...
}
В общем потом в каждой активити реализуем класс ActionBar в который потом просто передаём айди кнопки и обработчик и всё. Ничего лишнего. Паттерн это как каркас, так что код уменьшается в сотни раз, более читабельный и повышает "пристиж" приложения. Как я говорил если писать не для себя то это очень важный момент, так как заказчики часто обращают на такие моменты, а иногда даже спрашивают какие паттерны вы использовали в нашем приложении.
R.id.team
Политика на форуме запрещена

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

Re: Урок 14. Меню, группы, порядок. MenuInflater и xml-меню.

Сообщение math64 » 12 сен 2012, 07:54

В java нет возможности двойного наследования.
Поэтому нужно выбирать
1. Использовать в качестве базового класса предложенный мной MenuActivity - тогда код из ListActivity придётся копипастить (из исходников Android 4.x) в свой класс.
2. Использовать в качестве базового класса ListActivity. Для обработки меню написать класс MenuHelper и делегировать обработку меню туда

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

	@Override
	public void onCreate(Bundle savedInstanceState) {
		...
		menuHelper = new MenuHelper(this);
		...
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		return menuHelper.onCreateOptionsMenu(menu);
	}

	@Override
	public boolean onPrepareOptionsMenu(Menu menu) {
		return menuHelper.onPrepareOptionsMenu(menu);
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		return menuHelper.onOptionsItemSelected(menu);
	}

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 14. Меню, группы, порядок. MenuInflater и xml-меню.

Сообщение dil_android » 12 сен 2012, 13:21

Здравствуйте,

Вносится в порядке предложения автору: добавить в Урок 14 текст, ссылающийся на http://developer.android.com/guide/topics/ui/menus.html, где говорится, что "Начиная с Андроид 3.0 (API уровень 11) устройства, работающие на Андроид, не требуют более обеспечения специальной кнопкой Menu. После такого изменения, Андроид устройства должны уходить от традиционной 6-элементной панели меню, и, вместо этого, предоставлять action bar для представления общих активностей пользователя. Хотя дизайн и опыт пользователя для некоторых меню элементов изменился, семантика определения последовательности действий и опций все еще базируется на Menu APIs".

Многие вопросы можно было бы снять такой ссылкой.

Сегодня как раз изучал Урок 14, и убедился, что знания по созданию Menu абсолютно необходимы, независимо от того будет кнопка или нет.

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

Re: Урок 14. Меню, группы, порядок. MenuInflater и xml-меню.

Сообщение rezak90 » 12 сен 2012, 13:42

конечно знания по созданию нужны, так как хоть с кнопкой хоть без неё с ActionBar'ом меню строится так же.
R.id.team
Политика на форуме запрещена

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 14. Меню, группы, порядок. MenuInflater и xml-меню.

Сообщение dil_android » 12 сен 2012, 21:51

Копаясь дальше в http://developer.android.com/guide/topics/ui/menus.html нашел Popup menu - "при нажатии элемента экрана осуществляет действия, связанные с конкретным содержанием (элемента)".
Не хочу показаться неблагодарным, но может добавить этот раздел в урок, с тем, чтобы тема меню была раскрыта полностью: Options menu, Context menu, и Popup menu.

Если интересно:

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

 //СОЗДАНИЕ POPUP MENU
   
    public void showPopupMenu(View v) {
        PopupMenu popup = new PopupMenu(this, v);
        popup.getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu());

        popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            public boolean onMenuItemClick(MenuItem item) {

                switch (item.getItemId()) {
                    case R.id.menu1:
                        textView.setText("Menu item 1 clicked");
                        return true;
                    case R.id.menu2:
                        textView.setText("Menu item 2 clicked");
                        return true;
                    case R.id.menu3:
                        textView.setText("Menu item 3 clicked");
                        return true;
                        default:
                            return false;
                }
             }
        });
        popup.show();
        }
    }
На сайте разработчика дана следующая кодировка popup.setOnMenuItemClickListener(this);

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

public void showPopupMenu(View v) {
    PopupMenu popup = new PopupMenu(this, v);
    popup.setOnMenuItemClickListener(this);
    popup.inflate(R.menu.actions);
    popup.show();
}
Однако в этом виде выдается ошибка. После поисков в Интернете нашел представленный выше вариант написания.
Можно узнать, почему необходим именно такой вызов метода OnMenuItemClickListener().

Заранее спасибо.

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

Re: Урок 14. Меню, группы, порядок. MenuInflater и xml-меню.

Сообщение math64 » 13 сен 2012, 07:29

А ты у тебя есть implements PopupMenu.OnMenuItemClickListener в объявлении Activity?
Твой вариант с отдельным слушателем более применим для болшого приложения, в маленьних примерах можно просто реализовывать интерфейс в Activity - то же самое относится ко всем другим интерфейсам.

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 14. Меню, группы, порядок. MenuInflater и xml-меню.

Сообщение dil_android » 13 сен 2012, 11:06

Спасибо, сработало.

Совсем забыл о понятии Interface в Java.
Буду обновлять старые познания.
Вариант с отдельным слушателем мне тоже показался очень интересным.
Буду его использовать в дальнейшем.

Аватара пользователя
Xroft
Сообщения: 38
Зарегистрирован: 10 май 2012, 10:11

Re: Урок 14. Меню, группы, порядок. MenuInflater и xml-меню.

Сообщение Xroft » 22 сен 2012, 15:34

rezak90 писал(а):Xroft то что вы хотите это один из паттернов андроида который называется ActionBar. Но я бы не рекомендовал делать именно то как Вы хотите, а именно в стиле винды. Стиль винды это его стиль, у андроида (как и любой другой ОС) есть своя концепция на счёт внешнего вида. Соответственно там немножко по другому выглядит. Для ознакомления рекомендую прочитать концепцию гугла по андроиду: http://developer.android.com/design/index.html .
Но если Вы пишите приложения только для личного пользования, то "говнокодить" ещё никто не запрещал ;)
На счёт ActionBar'a добавлю что можно реализовывать его вручную (что гораздо приятнее), а так же можно воспользоваться известной библиотекой actionbarsherlock но она не даст полного понимания о паттернах (зато красивые вещи можно будет делать).
Сегодня решил взятся за ActionBar ... и тут оказывается, что под мой Android 2.3.3 нет ActionBar'a.
Подскажите, как можно реализовать ActionBar в Android 2.3.3

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

Re: Урок 14. Меню, группы, порядок. MenuInflater и xml-меню.

Сообщение rezak90 » 22 сен 2012, 15:39

Подскажите, как можно реализовать ActionBar в Android 2.3.3
ручками =) или же использовать библиотечку actionbarsherlock
R.id.team
Политика на форуме запрещена

Аватара пользователя
Xroft
Сообщения: 38
Зарегистрирован: 10 май 2012, 10:11

Re: Урок 14. Меню, группы, порядок. MenuInflater и xml-меню.

Сообщение Xroft » 22 сен 2012, 16:00

rezak90 писал(а):
Подскажите, как можно реализовать ActionBar в Android 2.3.3
ручками =) или же использовать библиотечку actionbarsherlock
Ткните пожалуйста носом туда, где об этом можно почитать на русском (желательно пример)
Заранее спасибо


Аватара пользователя
Xroft
Сообщения: 38
Зарегистрирован: 10 май 2012, 10:11

Re: Урок 14. Меню, группы, порядок. MenuInflater и xml-меню.

Сообщение Xroft » 22 сен 2012, 16:12

... не успел поправить пост как вы уже ответили)))) спасибо ...

Хотел спросить совет ... надо организовать на куче активити кнопки (одни и те же) перехода по основным пунктам программы(меню)
Может мне не морочится и просто организовать обычное меню по нажатию кнопки на устройстве?
Или один раз нарисовать XML и сделать под меню отдельный класс ... и в каждый активити добавлять XML и обработчики нажатий?
Что вы посоветуете для большого (в будущем), развивающегося приложения?

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

Re: Урок 14. Меню, группы, порядок. MenuInflater и xml-меню.

Сообщение rezak90 » 22 сен 2012, 16:38

В принципе можно и не заморачиваться, а реализовать любой велосипед))) но престижное и крутое приложение сейчас выглядит с навигациями, поиском и т.д. (для интереса посмотрите популярные программы), просмотрите guideline по android'у что бы в будущем не задаваться такими вопросами.
Могу сказать как однажды багфиксил индусский код. Так вот они сделали так себе барчик который отображался в каждой активити, а навигацию по нему делали таким образом: в статическом классе были у них как бы "синглтоны" и вот один из них был ArrayList<Activity> там сохранялись те активити которые были уже загружены, так вот если нужно попасть на какое либо активити они грузили его со списка, а если выйти с приложения то убивал все активити которые хранились в списке. Конечно интересный подход и можно так делать, но это изврат и не правильно, так как занимает больше памяти что в последствии может привести к падению приложения от не хватки памяти.
Так что лучше не ленится, а сделать по уму. Ведь будет красивей и самому приятней. А то что трудно так это только на первых порах.
R.id.team
Политика на форуме запрещена

Аватара пользователя
chuikoff
Сообщения: 17
Зарегистрирован: 30 мар 2012, 10:20
Откуда: Камчатка
Контактная информация:

Re: Урок 14. Меню, группы, порядок. MenuInflater и xml-меню.

Сообщение chuikoff » 24 сен 2012, 15:19

Я делал урок 14, первый пример "программный", и почему-то функция:

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

public boolean onPrepareOptionsMenu(Menu menu)
	{
		menu.setGroupVisible(1, myCheck.isChecked());
		return onPrepareOptionsMenu(menu);
	}
Вызывает недоумение у моего девайса. При нажатии на меню, происходит "Принудительная остановка", а если закомментировать данные строки, то всё работает без проблем.
Разработка сайтов любой сложности.

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

Re: Урок 14. Меню, группы, порядок. MenuInflater и xml-меню.

Сообщение rezak90 » 24 сен 2012, 15:22

и что можно понять под выражением "Принудительная остановка" ?! Если ошибка то лог ошибок и код со строкой где вылетает приложение в студию.
R.id.team
Политика на форуме запрещена

Ответить