Страница 3 из 10

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

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

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

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

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

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

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

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

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

Добавлено: 11 сен 2012, 22:49
rezak90
все мы время от времени "говнокодим" =)
а на счёт вашей проблемы я повторюсь, это всё реализовывает ActionBar. Вкратце: делаете для него разметку, строите класс для это разметки и всё, это полноценный View-компонент который подключаете ко всем активити.

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

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

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

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

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

Добавлено: 11 сен 2012, 23:19
rezak90
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 в который потом просто передаём айди кнопки и обработчик и всё. Ничего лишнего. Паттерн это как каркас, так что код уменьшается в сотни раз, более читабельный и повышает "пристиж" приложения. Как я говорил если писать не для себя то это очень важный момент, так как заказчики часто обращают на такие моменты, а иногда даже спрашивают какие паттерны вы использовали в нашем приложении.

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

Добавлено: 12 сен 2012, 07:54
math64
В 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);
	}

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

Добавлено: 12 сен 2012, 13:21
dil_android
Здравствуйте,

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

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

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

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

Добавлено: 12 сен 2012, 13:42
rezak90
конечно знания по созданию нужны, так как хоть с кнопкой хоть без неё с ActionBar'ом меню строится так же.

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

Добавлено: 12 сен 2012, 21:51
dil_android
Копаясь дальше в 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().

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

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

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

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

Добавлено: 13 сен 2012, 11:06
dil_android
Спасибо, сработало.

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

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

Добавлено: 22 сен 2012, 15:34
Xroft
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

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

Добавлено: 22 сен 2012, 15:39
rezak90
Подскажите, как можно реализовать ActionBar в Android 2.3.3
ручками =) или же использовать библиотечку actionbarsherlock

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

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

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

Добавлено: 22 сен 2012, 16:04
rezak90

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

Добавлено: 22 сен 2012, 16:12
Xroft
... не успел поправить пост как вы уже ответили)))) спасибо ...

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

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

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

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

Добавлено: 24 сен 2012, 15:19
chuikoff
Я делал урок 14, первый пример "программный", и почему-то функция:

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

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

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

Добавлено: 24 сен 2012, 15:22
rezak90
и что можно понять под выражением "Принудительная остановка" ?! Если ошибка то лог ошибок и код со строкой где вылетает приложение в студию.