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

Обсуждение уроков
Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 02 дек 2013, 21:49

ЗНачит внутри обработчик родителя просто возвращает true, но это лишь предположения, и для этого нужно знать исходники (а разработчики с девелопера их сами пишут).
Ниже по твоей ссылке пример с возвращением значения из метода суперкласса:

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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection
    switch (item.getItemId()) {
        case R.id.new_game:
            newGame();
            return true;
        case R.id.help:
            showHelp();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}
Имхо если пишешь обработку метода Override, то лучше вернуть значение из метода суперкласса и не морочить голову.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

mihalis
Сообщения: 17
Зарегистрирован: 28 ноя 2013, 23:32

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

Сообщение mihalis » 02 дек 2013, 22:18

Ох не знаю я зачем мне это, на лицо мое незнание предмета, но если мы почитаем описание этого метода, то найдем там такую строку:
Derived classes should call through to the base class for it to perform the default menu handling.
Что собственно и делают в кейсе default...

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 02 дек 2013, 22:30

и что? я твою мысль не поняла, с моим объяснением противоречия не вижу
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
C.Smith
Сообщения: 1
Зарегистрирован: 08 дек 2013, 18:45

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

Сообщение C.Smith » 08 дек 2013, 18:56

Здравствуйте, надеюсь вы ещё ведёте поддержку данного урока.
У меня возникла проблема с отображением меню - оно отображается всегда и полностью, т.е. нет укореченной версии... и всегда в столбик.
Скрин: http://prntscr.com/29mjjt
Код MainActivity:

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

package startandroid.simplemenu;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.CheckBox;
import android.widget.TextView;

public class MainActivity extends Activity {
	
	TextView tvText;
	CheckBox chb;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tvText=(TextView)findViewById(R.id.text);
        chb=(CheckBox)findViewById(R.id.chbExtMenu);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    	menu.add(0, 1, 0, "add");
        menu.add(0, 2, 0, "edit");
        menu.add(0, 3, 3, "delete");
        menu.add(1, 4, 1, "copy");
        menu.add(1, 5, 2, "paste");
        menu.add(1, 6, 4, "exit");
    	//getMenuInflater().inflate(R.menu.mymenu, menu);
        return super.onCreateOptionsMenu(menu);
    }
    public boolean onPrepareOptionMenu (Menu menu) {
    	menu.setGroupVisible(1, chb.isChecked());
    	return super.onPrepareOptionsMenu(menu);
    }
    
    public boolean onOptionsItemSelected(MenuItem item) {
    	StringBuilder sb = new StringBuilder();
    	sb.append("Menu item: ");
    	sb.append("\r\nGroup id: " + String.valueOf(item.getGroupId()));
    	sb.append("\r\nItem id: " + String.valueOf(item.getItemId()));
    	sb.append("\r\nOrder: " + String.valueOf(item.getOrder()));
    	sb.append("\r\nTitle: " + String.valueOf(item.getTitle()));
    	tvText.setText(sb);
		return super.onOptionsItemSelected(item);    	
    }
    
}
Подскажите, пожалуйста, в чём я не прав.
З.Ы. Вдруг пригодится - может не получается как должно из за целевой версии?

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

<uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="18" />

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

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

Сообщение damager82 » 10 дек 2013, 22:20

C.Smith писал(а):Здравствуйте, надеюсь вы ещё ведёте поддержку данного урока.
У меня возникла проблема с отображением меню - оно отображается всегда и полностью, т.е. нет укореченной версии... и всегда в столбик.
Подскажите, пожалуйста, в чём я не прав.
У вас опечатка в имени метода: onPrepareOptionMenu. Буква s пропущена, метод другой, вот скрытие группы и не отрабатывает.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

alexander88
Сообщения: 1
Зарегистрирован: 14 дек 2013, 10:54

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

Сообщение alexander88 » 14 дек 2013, 10:58

Доброго дня! Подскажите, необходимо добавить пункт в базовое меню т.е. допустим в меню контакта или смски и этот пункт должен указываеть на стороннее приложение! каким образом это можно сделать и возможно ли вообще?
Спасибо.

TittTitov
Сообщения: 27
Зарегистрирован: 20 ноя 2013, 22:46

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

Сообщение TittTitov » 02 янв 2014, 23:19

Доброго времени суток!

Что означает этот код в уроке:
Код.PNG
Код.PNG (41.38 КБ) 13895 просмотров
Конкретно интересует расшифровка начиная со сторки: StringBuilder sb = new StringBuilder();
В уроке насчёт использования метода onOptionsItemSelected лишь сказано, что здесь мы выводим в TextView информацию о нажатом пункте и предлагается сверить эту информацию с тем, что мы кодили при создании пунктов меню.
Мне непонятно что такое "sb.append" и что это за параметры - "\r\n , а также для чего пишется "String.valueOf"

ЗЫ: Сорри за глупые вопросы. Лузер из лузеров, так сказать... Иду по порядку по урокам - наткнулся на непонятку, почему-то не разобранную в данном уроке. Спасибо!

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

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

Сообщение altwin » 02 янв 2014, 23:43

TittTitov писал(а): Конкретно интересует расшифровка начиная со сторки: StringBuilder sb = new StringBuilder();
В уроке насчёт использования метода onOptionsItemSelected лишь сказано, что здесь мы выводим в TextView информацию о нажатом пункте и предлагается сверить эту информацию с тем, что мы кодили при создании пунктов меню.
Мне непонятно что такое "sb.append" и что это за параметры - "\r\n , а также для чего пишется "String.valueOf"
StringBuilder Это класс - ПостроительСтрок. Без знания основ(это именно основы) java нечего делать в Android разработке.
Класс формирует строку. sb - объект этого класса, т.е. в будущем строка(которую мы и строим). метод append()(присоединить) - присоединят/добавляет строку в этот объект, т.е. все, что было заappendино - в итоге одна строка, которая храниться где то в памяти и sb - ссылка на этот адрес. \r\n - символы возврата каретки/перевода строки, стандартное форматирование текста(то, что в MS Word скрывается под страшным словом "непечатаемый символ".) или Управляющие символы и управляют они форматированием букав(правильней наверно сказать их разметкой, что -то вроде html тегов, но понятное всем, а не только браузеру).

P.S. toString() - тоже метод класса, который можно найти в документации(придется учиться ей пользоваться), который есть у всех классов, по сути - просто возвращает строковое представление объекта, в данном случае текст который там хранится.
Просто к слову - у вас есть лучший в мире учитель, которому вы можете задавать любой вопрос в любое время. Ваша задача лишь научиться находить с ним общий язык, для начала этого будет более, чем достаточно. Зовут его папка google/
Изображение

TittTitov
Сообщения: 27
Зарегистрирован: 20 ноя 2013, 22:46

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

Сообщение TittTitov » 25 янв 2014, 22:17

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

Объясните, пожалуйста как работает метод onOptionsItemSelected(MenuItem item), а именно - как задавать команды, для нажатых пунктов меню.

Например, у меня два пункта в меню: "exit" и "info", по нажатию первого пункта нужно закрыть текущее активити (finish()), а по второму просто вывести сообщение Toast. Как это сделать? Спасибо!

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

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

Сообщение altwin » 26 янв 2014, 15:46

TittTitov писал(а):Здравствуйте!

Объясните, пожалуйста как работает метод onOptionsItemSelected(MenuItem item), а именно - как задавать команды, для нажатых пунктов меню.

Например, у меня два пункта в меню: "exit" и "info", по нажатию первого пункта нужно закрыть текущее активити (finish()), а по второму просто вывести сообщение Toast. Как это сделать? Спасибо!
onCreateOptionsMenu(Menu menu) создает меню, в котором вы перечисляете item. Далее в onOptionsItemSelected(MenuItem item), вы выполняете действия с выбранным item. Т.е. в нем, case: item=="exit"?finish:item=="info"
Изображение

andreyua
Сообщения: 4
Зарегистрирован: 25 фев 2014, 19:55

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

Сообщение andreyua » 25 фев 2014, 19:56

Объясните пожалуйста , как вызывать контекстное меню на главном экране , а не на элементах view... ?

bayah
Сообщения: 5
Зарегистрирован: 07 апр 2014, 15:01

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

Сообщение bayah » 08 апр 2014, 03:37

Здравствуйте.
Делаю урок на SDK 22.6.2. и как я понял, с некоторых пор андроид приложение по умолчанию стало иметь другую структуру - с проектом создается appcompat_v7 саппорт библиотека, в проекте помимо основного активити создается фрагмент.
В общем у меня проблема, как мне кажется именно с этой особенностью.

Происходит так, что метод onPrepareOptionsMenu вызывается лишь единожды, при запуске приложения, а когда вызываю меню, то метод не выполняется, вследствии чего естественно, меню показывается только в сокращенном варианте.
Что не так, подскажите?
Вот код:

MainActivity.java

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


package com.example.p0141_menu_adv;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {
	
	//Элементы экрана
	static TextView tv;
	static CheckBox chb;
	
	
	
	private static final String TAG = "myLogs";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    	//this.
    	Log.d(TAG, "in onCreate");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment())
                    .commit();
        }

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        
        //добавляем пункты меню
        menu.add(0, 1, 0, "add");
        menu.add(0, 2, 0, "edit"); 
        menu.add(0, 3, 3, "delete");
        menu.add(1, 4, 1, "copy");
        menu.add(1, 5, 2, "paste");
        menu.add(1, 6, 4, "exit");
        
        return super.onCreateOptionsMenu(menu);
        //return true;
    }
    
    
    @Override
    public boolean onPrepareOptionsMenu(Menu menu){
    	//пункты меню с ID группы = 1 видня, если в CheckBox стоит галка    
    	menu.setGroupVisible(1, chb.isChecked());
    	Log.d(TAG, "in onPrepareOptionsMenu");
    	
    	return super.onPrepareOptionsMenu(menu);
    }	
    


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        
        StringBuilder sb = new StringBuilder();
        
        //выведем в 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: " + String.valueOf(item.getTitle()));
        
        tv.setText(sb.toString());
        
        
        
        return super.onOptionsItemSelected(item);
    }

    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container, false);
            
            
            //находим элементы
            tv = (TextView) rootView.findViewById(R.id.textView);
            chb = (CheckBox) rootView.findViewById(R.id.chbExtMenu);
            
            return rootView;
        }
        

        
    }

}

fragment_main.xml

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

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"> 

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView"
        android:text="text">
    </TextView>   
    
    <CheckBox 
        android:id="@+id/chbExtMenu"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="расширенное меню">
    </CheckBox>
     
</LinearLayout>

tvv_yar
Сообщения: 2
Зарегистрирован: 19 апр 2014, 06:41

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

Сообщение tvv_yar » 19 апр 2014, 08:44

Ситуация аналогична предыдущему реплаю.

Создаю проект:
Мин. версия 10
Целевая 10
Compile With: KitKat 4.4 - иначе визард не позволяет создать Activity

Код урока несколько скорректирован, для обеспечения совместимости с фрагментами и выглядит вот так:

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

package ru.yar.tvv.menuadv;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {

	static TextView tv;
	static CheckBox chb;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment())
                    .commit();
        }
    }



    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container, false);
            // находим эдементы
            tv = (TextView) rootView.findViewById(R.id.textView);
            chb = (CheckBox) rootView.findViewById(R.id.chbExtMenu);
            return rootView;
        }
    }
    // создание меню
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
      // TODO Auto-generated method stub
      // добавляем пункты меню
      menu.add(0, 1, 0, "add");
      menu.add(0, 2, 0, "edit");
      menu.add(0, 3, 3, "delete");
      menu.add(1, 4, 1, "copy");
      menu.add(1, 5, 2, "paste");
      menu.add(1, 6, 4, "exit");
      
      return super.onCreateOptionsMenu(menu);
    }
    
    // обновление меню
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
      // TODO Auto-generated method stub
      Log.d("MyLog","пункты меню с ID группы = 1 видны, если в CheckBox стоит галка");
      menu.setGroupVisible(1, chb.isChecked());
      return super.onPrepareOptionsMenu(menu);
    }

    // обработка нажатий
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
      // TODO Auto-generated method stub
      StringBuilder sb = new StringBuilder();

      // Выведем в 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(sb.toString());
      
      return super.onOptionsItemSelected(item);
    }
}
На выходе имею две проблемы:
1. Меня выглядит как-то криво, совсем не так, как в иллюстрациях к урокам, см. скрин 1.
2. Состояние галки не влияет на содержимое меню. OnPrepeareOptionsMenu отрабатывает только один раз, при запуске проекта, но не отрабатывает каждый раз перед показом меню, как ожидается. См. скрин 2. Галочка включена, но меню без изменений.

Буду благодарен, если кто-то объяснит причины такого поведения. И способы все таки обновлять меню перед открытием. Заранее спасибо.
Вложения
screen 2.JPG
screen 2.JPG (59.42 КБ) 13732 просмотра
screen 1.JPG
screen 1.JPG (59.93 КБ) 13732 просмотра

javajunior
Сообщения: 17
Зарегистрирован: 29 мар 2014, 17:23

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

Сообщение javajunior » 21 апр 2014, 02:11

bayah писал(а):Здравствуйте.
Делаю урок на SDK 22.6.2. и как я понял, с некоторых пор андроид приложение по умолчанию стало иметь другую структуру - с проектом создается appcompat_v7 саппорт библиотека, в проекте помимо основного активити создается фрагмент.
В общем у меня проблема, как мне кажется именно с этой особенностью.
21-04-2014 5-00-59.jpg
21-04-2014 5-00-59.jpg (82.34 КБ) 13720 просмотров
21-04-2014 5-04-07.jpg
21-04-2014 5-04-07.jpg (59.78 КБ) 13720 просмотров
21-04-2014 5-06-34.jpg
21-04-2014 5-06-34.jpg (24.46 КБ) 13720 просмотров
После проделанного не забудьте сохранить проект ctrl + S

tvv_yar
Сообщения: 2
Зарегистрирован: 19 апр 2014, 06:41

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

Сообщение tvv_yar » 22 апр 2014, 10:02

Разобрался! Попробую объяснить.
tvv_yar писал(а):Ситуация аналогична предыдущему реплаю.

Создаю проект:
Мин. версия 10
Целевая 10
Compile With: KitKat 4.4 - иначе визард не позволяет создать Activity

Код урока несколько скорректирован, для обеспечения совместимости с фрагментами и выглядит вот так:

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

package ru.yar.tvv.menuadv;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {

	static TextView tv;
	static CheckBox chb;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment())
                    .commit();
        }
    }



    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container, false);
            // находим эдементы
            tv = (TextView) rootView.findViewById(R.id.textView);
            chb = (CheckBox) rootView.findViewById(R.id.chbExtMenu);
            return rootView;
        }
    }
    // создание меню
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
      // TODO Auto-generated method stub
      // добавляем пункты меню
      menu.add(0, 1, 0, "add");
      menu.add(0, 2, 0, "edit");
      menu.add(0, 3, 3, "delete");
      menu.add(1, 4, 1, "copy");
      menu.add(1, 5, 2, "paste");
      menu.add(1, 6, 4, "exit");
      
      return super.onCreateOptionsMenu(menu);
    }
    
    // обновление меню
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
      // TODO Auto-generated method stub
      Log.d("MyLog","пункты меню с ID группы = 1 видны, если в CheckBox стоит галка");
      menu.setGroupVisible(1, chb.isChecked());
      return super.onPrepareOptionsMenu(menu);
    }

    // обработка нажатий
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
      // TODO Auto-generated method stub
      StringBuilder sb = new StringBuilder();

      // Выведем в 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(sb.toString());
      
      return super.onOptionsItemSelected(item);
    }
}
На выходе имею две проблемы:
1. Меня выглядит как-то криво, совсем не так, как в иллюстрациях к урокам, см. скрин 1.
2. Состояние галки не влияет на содержимое меню. OnPrepeareOptionsMenu отрабатывает только один раз, при запуске проекта, но не отрабатывает каждый раз перед показом меню, как ожидается. См. скрин 2. Галочка включена, но меню без изменений.

Буду благодарен, если кто-то объяснит причины такого поведения. И способы все таки обновлять меню перед открытием. Заранее спасибо.
Суть такая, свежий SDK вынуждает нас использовать фрагменты при работе с интерфейсом. В объектах фрагментов реализованы те же самые методы (одноименные), как и у объектов активити, однако же их поведение несколько различается. Так метод onPrepareOptionsMenu у Activity - отрабатывает каждый раз перед отображением меню, а тот же метод, но у фрагмента - только сразу в момент создания меню. Еще важный момент - сам класс MainActivity должен наследываться от класса android.app.Activity а не от android.support.v7.app.ActionBarActivity или android.support.v4.app.Fragments, как предлагает нам SDK, стараясь обеспечить совместимость с фрагментами и ActionBar'ом. Более того, внешний вид меню из класса Activity и из класса ActionBarActivity существенно различается. Использование класса Activity обеспечивает и ожидаемый (описанный в уроке) внешний вид меню и его поведение.

Таким образом, после выдирания всего, что связано с ActionBar и фрагментами все заработало. Ниже привожу код:

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

package ru.yar.tvv.tvvmenu;

import android.app.Activity;
import android.os.Bundle;
//import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.CheckBox;
import android.widget.TextView;

public class MainActivity extends Activity {
	  
	// Элементы экрана
	static TextView tv;
	static CheckBox chb;
	  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // находим эдементы
        tv = (TextView) findViewById(R.id.textView);
        chb = (CheckBox) findViewById(R.id.chbExtMenu);

    }

        // создание меню
         /* (non-Javadoc)
		 * @see android.app.Activity#onCreateOptionsMenu(android.view.Menu)
		 */
		@Override
		public boolean onCreateOptionsMenu(Menu menu) {
			// TODO Auto-generated method stub
			  menu.add(0, 1, 0, "add");
	          menu.add(0, 2, 0, "edit");
	          menu.add(0, 3, 3, "delete");
	          menu.add(1, 4, 1, "copy");
	          menu.add(1, 5, 2, "paste");
	          menu.add(1, 6, 4, "exit");
	          
			return super.onCreateOptionsMenu(menu);
		}

		// обновление меню
        @Override
        public boolean onPrepareOptionsMenu(Menu menu) {
          // TODO Auto-generated method stub
          Log.d("MyLog","пункты меню с ID группы = 1 видны, если в CheckBox стоит галка");
          menu.setGroupVisible(1, chb.isChecked());
          
          return super.onPrepareOptionsMenu(menu);
        }

        // обработка нажатий
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
          // TODO Auto-generated method stub
          StringBuilder sb = new StringBuilder();

          // Выведем в 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(sb.toString());
          
          return super.onOptionsItemSelected(item);
        }
}
Естественно, имя package должно быть ваше. Еще я изменил имя формы c fragments_main.xml на main.xml, учитывайте это.
И еще очень важный вопрос - внимательнее с переопределением методов OnCreateOptionsMenu, OnPrepareOptionsMenu, OnOptionsItemSelected - их синтаксис может немного отличаться от синтаксиса соответсвующих методов из ActionBarActivity.

Вроде все. Удачи всем.

Аватара пользователя
HizZ
Сообщения: 4
Зарегистрирован: 23 апр 2014, 08:30
Откуда: Украина, Киев

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

Сообщение HizZ » 26 апр 2014, 03:15

Вот смотрел я урок 14 на Ютубе и там Виталий копирует уже готовый код в xml-файл и потом весь код обретает правильную табуляцию. Это какой то "фокус" или он это сделал ручками и ловко этото процес вирезал из видео?
Если что-то не работает - подробно опишите проблему своему коту.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

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

Сообщение Mikhail_dev » 26 апр 2014, 08:48

Выделить текст (клавиши Ctrla + A), либо выделить только нужный код, после Ctrl+Shift+F

Yurets
Сообщения: 48
Зарегистрирован: 06 май 2014, 19:07

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

Сообщение Yurets » 06 май 2014, 19:11

Добрый день!
Я новый в андроиде и возник вопрос...

После создания файла mymenu.xml и его наполнения, не создаётся константа в R.menu... а создаётся в R.layout.
...
getMenuInflater().inflate(R.layout.mymenu, menu);
return super.onCreateOptionsMenu(menu);
....
если обращаюсь через R.layout.mymenu, то всё чики-пуки... а в R.menu не выходит... кто знает в чём может быть проблема?

Donart
Сообщения: 114
Зарегистрирован: 06 ноя 2013, 08:59

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

Сообщение Donart » 06 май 2014, 20:08

Yurets писал(а): кто знает в чём может быть проблема?
Это строчка из урока.
Чтобы получить меню, которые мы создавали программно на этом уроке, надо создать в папке res/menu файл mymenu.xml

Yurets
Сообщения: 48
Зарегистрирован: 06 май 2014, 19:07

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

Сообщение Yurets » 06 май 2014, 20:27

Действительно, не в ту папку бросил...
Спасибо!

Ответить