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

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

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

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

А всё, разобрался...пропустил super тут return onPrepareOptionsMenu(menu);
Разработка сайтов любой сложности.

4ebureG
Сообщения: 1
Зарегистрирован: 07 окт 2012, 22:05

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

Сообщение 4ebureG » 07 окт 2012, 22:08

Помогите пожалуйста! Проблема в том, что
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
menu.setGroupVisible(R.id.group1, checkBox1.isChecked());
return super.onPrepareOptionsMenu(menu);
}
в этом месте, а точнее на setGroupVisible приложение вылетает, без этой команды все работает отлично, а с ней беда какая-то ...

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

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

Сообщение rezak90 » 08 окт 2012, 07:52

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

$01ny$hko
Сообщения: 44
Зарегистрирован: 18 окт 2012, 10:11

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

Сообщение $01ny$hko » 21 окт 2012, 20:17

Всем привет!! В первую очередь огромная благодарность "создателю" - великолепное изложение, всё очень доступно даже начинающим с нуля!!! Во-вторых за беседы и рассуждения тоже спасибо, очень помогают доосмыслить некоторые нюансы!! Ну вот всех поблагодарила, можно и совет спросить ))). Зараннее сори, если что-нить банальное буду спрашивать, но я пока что не волшебник ))). У меня такая ситуация: в приложении три экрана, соответственно каждому своя Activity и xml-ка. Для меню создала mymenu.xml, здесь у меня один пункт "настройки". Мне необходимо, чтобы по нажатию этого пункта вызывался список из шести подпунктов: "профиль", "помощь", " о программе", и бла-бла... у каждого из которых будет своё содержимое. И вот тут я втупила: не понимаю где прописать обработку нажатия и нужно ли для каждого подпункта создавать отдельную Activity или есть более рациональные варианты??? Очень рассчитываю на вашу помощь.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

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

Сообщение KamiSempai » 21 окт 2012, 22:01

Если у экранов "профиль", "помощь", " о программе", и бла-бла... нет ничего общего, лучше под каждый сделать отдельную Activity.
А меню должно быть общим для всех 3 экранов? Или 3 экрана это и есть "профиль", "помощь", " о программе", и бла-бла?
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

$01ny$hko
Сообщения: 44
Зарегистрирован: 18 окт 2012, 10:11

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

Сообщение $01ny$hko » 22 окт 2012, 09:49

1. Спасибо, что так скоренько))!! Да у этих ( "профиль", "помощь", " о программе", и бла-бла...) подпунктов ничего общего не намечается. На счёт Activity поняла спасибо, сделаю. Планирую эти подпункты выводить с помощью spinner. На сколько я понимаю здесь было бы логично реализовать дочернее PopupMenu, но с этим я не разобралась (((? А само меню,да, общее для трёх основных экранов, я это уже реализовала, везде нормально отображается. 2. Остаётся открытым вопрос где ж всё-таки прописать обработку нажатия пункта "настройки": в MainActivity или же нужно создать отдельный класс MenuActivity.java ?

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

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

Сообщение AndreyI » 22 окт 2012, 11:33

Переопределяем метод onOptionsItemSelected(MenuItem item) в MainActivity этот метод будет вызываться при нажатии пунктов меню. В уроке же это есть.

Чтобы не ошибиться при вводе переопределяемых (Override) методов класса рекомендую делать это с использованием встроенных возможностей IDE Eclipse (если вы им пользуетесь):
В меню Source выбираем пункт Override/Implement Methods... там находим onOptionsItemSelected(MenuItem item), Eclipse сделает пустую заготовку переопределяемого метода, вам нужно будет только добавить свой код в эту заготовку.

$01ny$hko
Сообщения: 44
Зарегистрирован: 18 окт 2012, 10:11

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

Сообщение $01ny$hko » 22 окт 2012, 13:22

????? Я добавила метод onOptionsItemSelected(MenuItem item) в MainActivity. Понимаю, что ему на вход нужен Id пункта меню, а что прописать на выход, чтобы отобразился spinner с подпунктами????? У меня Меню создано не программно, а через xml. В нём единственный пункт "настройки", при нажатии на который я хочу видеть к примеру spinner с шестью подпунктами, для каждого из которых будет вызываться своя Activity, так как они будут содержать много редактируемых и статичных элементов.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

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

Сообщение KamiSempai » 22 окт 2012, 13:25

Для вывода списка можно использовать AlertDialog (Урок по AlertDialog).
Только зачем все так усложнять, почему не вывести эти пункты сразу в меню?

Вот кусок реального кода который обрабатывает нажатие пункта меню:

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

    @Override 
    public boolean onOptionsItemSelected(MenuItem item){ 
        switch (item.getItemId()) { 
        case R.id.menu_sort_duration:
            	sortArray(R.id.menu_sort_duration);
                break; 
        case R.id.menu_sort_price: 
                sortArray(R.id.menu_sort_price);
                break; 
        } 
        return false;
	}
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

$01ny$hko
Сообщения: 44
Зарегистрирован: 18 окт 2012, 10:11

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

Сообщение $01ny$hko » 22 окт 2012, 14:19

Эх, я по началу так и делала что они все были пунктами меню, тока передо мной поставили задачу, в которой нужно сделать именно так как я описывала (((. Спасибо за подсказку, буду пытаться!

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

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

Сообщение AndreyI » 22 окт 2012, 17:22

$01ny$hko писал(а):????? Я добавила метод onOptionsItemSelected(MenuItem item) в MainActivity. Понимаю, что ему на вход нужен Id пункта меню, а что прописать на выход, чтобы отобразился spinner с подпунктами????? У меня Меню создано не программно, а через xml. В нём единственный пункт "настройки", при нажатии на который я хочу видеть к примеру spinner с шестью подпунктами, для каждого из которых будет вызываться своя Activity, так как они будут содержать много редактируемых и статичных элементов.
В Андроид для управлениями настройками есть специальное Activity - PreferenceActivity
Смотрите уроки 71-74 (ну и про настройки урок 33), думаю в них вы найдете все что нужно.

$01ny$hko
Сообщения: 44
Зарегистрирован: 18 окт 2012, 10:11

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

Сообщение $01ny$hko » 22 окт 2012, 17:52

В Андроид для управлениями настройками есть специальное Activity - PreferenceActivity
Смотрите уроки 71-74 (ну и про настройки урок 33), думаю в них вы найдете все что нужно.

Спасибо Вам! Только меня сейчас не настройки приложения интересуют, а именно то меню, которое в уроке 14 описывается. Только у меня должен быть один пункт с названием "настройки".

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

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

Сообщение AndreyI » 22 окт 2012, 19:05

Ну так и вызывайте из обработчика нажатия свое Activity с настройкам.

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

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case R.id.menu_settings:
			Intent intent= new Intent(this, PrefActivity.class);
			startActivity(intent);
			break;		
		}
		return super.onOptionsItemSelected(item);
	}
Здесь switch добавлен на случай, если вы захотите в будущем добавить еще пункты меню, если у вас один единственный пункт, то можно обойтись без него.

Можно сделать и по-другому, вообще не переопределять onOptionsItemSelected, а в onCreateOptionsMenu пункту меню с настройками добавить Intent для вызова Activity с настройками. Тогда вызов произойдет автоматически при нажатии пункта меню.

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

@Override
	public boolean onCreateOptionsMenu(Menu menu) {		
		getMenuInflater().inflate(R.menu.activity_main, menu);
		Intent intent= new Intent(this, PrefActivity.class);
		menu.findItem(R.id.menu_settings).setIntent(intent);
		return true;
	}

PrefActivity - Это ваше Activity с настройками, разумеется можете придумать свое имя класса.

$01ny$hko
Сообщения: 44
Зарегистрирован: 18 окт 2012, 10:11

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

Сообщение $01ny$hko » 23 окт 2012, 13:02

Благодарю за помощь!!! Уже разобралась и так и сделала ))). Правда про onCreateOptionsMenu не догадалась, учту, спасибо.

$01ny$hko
Сообщения: 44
Зарегистрирован: 18 окт 2012, 10:11

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

Сообщение $01ny$hko » 23 окт 2012, 13:44

Теперь вообще всё поменяла - отдельный экран открывается сразу при нажатии кнопки Меню на девайсе. Может кому пригодится, вот код, перехватывающий её нажатие:
@Override
public boolean onKeyDown(int KeyCode, KeyEvent event) {
if (KeyCode == KeyEvent.KEYCODE_MENU) {
Intent intent= new Intent(this, SettingsActivity.class);
startActivity(intent);
return true;
}
return super.onKeyDown(KeyCode, event);
}

Kalim32rus
Сообщения: 7
Зарегистрирован: 24 ноя 2012, 22:41

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

Сообщение Kalim32rus » 24 ноя 2012, 22:45

Добрый вечер! огромное спасибо за развёрнутый гайд, но интересует один вопрос: как сделать так, чтобы по нажатию на элемент меню выводилась не информация об этом элементе, а заранее заготовленный текст?. Меню создавал в MainActivity.java и классе MainActivity
Спасибо большое заранее

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

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

Сообщение damager82 » 27 ноя 2012, 10:14

Kalim32rus писал(а):Добрый вечер! огромное спасибо за развёрнутый гайд, но интересует один вопрос: как сделать так, чтобы по нажатию на элемент меню выводилась не информация об этом элементе, а заранее заготовленный текст?. Меню создавал в MainActivity.java и классе MainActivity
Спасибо большое заранее
В onOptionsItemSelected убираете sb и пишете

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

tv.setText("Ваш текст");
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Kalim32rus
Сообщения: 7
Зарегистрирован: 24 ноя 2012, 22:41

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

Сообщение Kalim32rus » 27 ноя 2012, 20:03

damager82 писал(а):В onOptionsItemSelected убираете sb и пишете

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

tv.setText("Ваш текст");
Вы наверное не так поняли, у каждого пункта меню должен быть свой текст, а по этому способу выводится всегда одно и то же

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

// Выведем в TextView информацию о нажатом пункте меню 
	      sb.append("Item Menu");
	      sb.append("\r\n groupId: " + String.valueOf(item.getGroupId()));
	      sb.append("\r\n itemId: " + String.valueOf(item.getItemId()));
	      sb.append("\r\n order: " + String.valueOf(item.getOrder()));
	      sb.append("\r\n title: " + item.getTitle());
	      tv.setText("OtherText");
Может как-то осуществить проверку нажатого пункта по ID и на основе этого выдавать информацию?

Digetix
Сообщения: 117
Зарегистрирован: 12 окт 2012, 15:31

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

Сообщение Digetix » 29 ноя 2012, 13:50

Kalim32rus писал(а):
damager82 писал(а):В onOptionsItemSelected убираете sb и пишете

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

tv.setText("Ваш текст");
Может как-то осуществить проверку нажатого пункта по ID и на основе этого выдавать информацию?

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

// Выбор пункта Меню 
	@Override
	 public boolean onOptionsItemSelected(MenuItem item) 
	 {
	     switch (item.getItemId()) 
	 	{
	     case R.id.menu_1:	    	 
                 // сюда можно добавить нужный вам код вывода какой-то информации
	         return true;	
	     case R.id.menu_2:
                 // сюда можно добавить нужный вам код вывода какой-то информации
	         return true;		     	
	     case R.id.menu_exit:	    	 	    	 
	         finish(); // это кнопка меню Выход, закрывает приложение, если в нём одна Активити
	         return true;
	     default:
	         return super.onOptionsItemSelected(item);
	     }
	 }
// Конец выбора пункта Меню 

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

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@+id/menu_1"
          android:title="@string/menu_1" />
    <item android:id="@+id/menu_2"
          android:title="@string/menu_2" />
    <item android:id="@+id/menu_exit"
          android:title="@string/menu_exit" />
</menu>

kharbey
Сообщения: 2
Зарегистрирован: 11 ноя 2012, 11:07

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

Сообщение kharbey » 02 дек 2012, 07:43

Здравствуйте всем.
Такой вопрос. Может я не до конца понимаю.
В своем приложении я в логах заметил, что метод onCreateOptionsMenu запускается сразу же после создания активности и после него сразу же запускается метод onPrepareOptionsMenu, хотя я не нажимаю на кнопку меню. И потом когда нажимаю на кнопку вызова меню появляется меню, но onPrepareOptionsMenu не срабатывает. Только в последующих вызовах onPrepareOptionsMenu срабатывает после нажатия кнопки вызова меню.
И это все ведет к неправильной работе моего меню. То есть у меня есть пункт меню, который в зависимости от некоторых действий либо активен или неактивен. Но из-за того, что при первом вызове меню onPrepareOptionsMenu выполнился до нажатия, в первый раз меню отображается неправильно. А в последующих все нормально работает.
Может у кого-нибудь тоже такое было? Может я что-то упустил, а если нет, то как разрешить эту проблему?

Ответить