Елементите от менюто се показват в лентата с действия във 2.1, но не и в 4.0.3, 4.2 (nexus 4) с помощта на ActionBarSherlock

Опитвам се да внедря ActionBarSherlock в моя проект. Добавянето на елементи от меню/действия към лентата за действия работи на 2.1, но не и в моя nexus4, не и в емулатор 4.0.3. Проблемът е, че функцията onCreateOptionsMenu(Menu menu) никога не се извиква в моето устройство, но се извиква във 2.1 и следователно не се показват елементи за действие в лентата за действия в телефона ми.

  1. Включих ActionBarSherlock като библиотека в моя проект.
  2. Зададох подходяща тема в приложението във файла на манифеста.
  3. Разширих моя клас на дейност със SherlockActivity.
  4. Замених съответния клас от библиотеката на Шерлок (досега знам, че ако не беше, менюто нямаше да се показва в лентата за действие и във 2.1)

Следва част от манифеста, където е зададена тема.

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.Sherlock.Light.DarkActionBar" >

Следва файл menu.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/menu_item_call"
        android:showAsAction="always"
        android:title="Call"/>
    <item
        android:id="@+id/menu_item_share"
        android:showAsAction="always"
        android:title="Share"/>
    <item
        android:id="@+id/menu_item_save"
        android:showAsAction="always"
        android:title="Save"/>

</menu>

Следва подходяща част от дейността.

    //other imports
        import com.actionbarsherlock.app.SherlockActivity;
        import com.actionbarsherlock.view.Menu;
        import com.actionbarsherlock.view.MenuInflater;
        import com.actionbarsherlock.view.Window;

        public class SelectCategories extends SherlockActivity implements
                OnClickListener {


        //other code


        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // TODO Auto-generated method stub
            MenuInflater inflater = getSupportMenuInflater();
            inflater.inflate(R.menu.menu, menu);
            return super.onCreateOptionsMenu(menu);
//return true; also has no effect
        }
        }

Опитвах се да разреша този проблем и минаха няколко часа, но не успях. Моля, помогни ми. Благодаря ви предварително.


person Dipendra    schedule 07.07.2013    source източник
comment
Може би задайте и android:theme в Activity или проверете своя override клас в библиотеката на sherlock.   -  person Gina    schedule 08.07.2013


Отговори (4)


Трябва да върнете true; вместо super.onCreateOptionsMenu(menu);

person Jon    schedule 07.07.2013

Това е функцията onCreateOptionsMenu, която използвам в моя проект с ActionBarSherlock:

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
       getSupportMenuInflater().inflate(R.menu.menu, menu);
       return true;
    }

Иска ми се да мога да ви кажа защо вашият не работи правилно.

person michaelcarrano    schedule 08.07.2013

Имахте ли тези в onCreate

private ActionBar mActionBar;
mActionBar = getSupportActionBar();
// mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
// mActionBar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);

нужда от импортиране

import com.actionbarsherlock.app.ActionBar;

Актуализация: ActionBar

Отворена декларация

com.actionbarsherlock.app.ActionBar

Функция на прозорец в горната част на дейността, която може да показва заглавието на дейността, режимите на навигация и други интерактивни елементи.

Започвайки с Android 3.0 (API ниво 11), лентата за действие се появява в горната част на прозореца на дейност, когато дейността използва Holo темата на системата (или една от нейните наследствени теми), която е по подразбиране. В противен случай можете да добавите лентата за действие, като извикате requestFeature(FEATURE_ACTION_BAR) или като я декларирате в персонализирана тема със свойството windowActionBar.

По подразбиране лентата с действия показва иконата на приложението вляво, последвана от заглавието на дейността. Ако дейността ви има меню с опции, можете да направите избраните елементи достъпни директно от лентата с действия като „елементи за действие“. Можете също така да промените различни характеристики на лентата с действия или да я премахнете напълно.

От дейността си можете да извлечете екземпляр на ActionBar, като извикате getActionBar().

В някои случаи лентата за действие може да бъде насложена от друга лента, която позволява контекстуални действия, използвайки android.view.ActionMode. Например, когато потребителят избере един или повече елементи във вашата дейност, можете да активирате режим на действие, който предлага действия, специфични за избраните елементи, с потребителски интерфейс, който временно замества лентата с действия. Въпреки че потребителският интерфейс може да заема същото пространство, API на android.view.ActionMode са различни и независими от тези за ActionBar.

Ръководства за разработчици За информация как да използвате лентата с действия, включително как да добавяте елементи за действие, режими за навигация и други, прочетете ръководството за разработчици на лентата с действия.

person Gina    schedule 08.07.2013
comment
Но какво да правим с този обект, ако не го използваме? - person Dipendra; 08.07.2013
comment
Какво имаш предвид, добавям само това и приложението ми работи както на 2.3, така и на 4.0.3. премахнете коментара, ако това работи за вас, коментирам го, защото не съм сигурен, че е подходящо за вас. - person Gina; 08.07.2013
comment
mActionBar има нулева стойност. Изумени. Може би това е причината. Трябва да я разбера. - person Dipendra; 08.07.2013
comment
null actionBar опитайте да добавите onCreate requestWindowFeature(Window.FEATURE_ACTION_BAR); //not sure which feature - person Gina; 08.07.2013

Най-накрая разбрах проблема.

Всъщност се опитвах да променя съществуващия проект, за да използвам лентата за действие. И основното е, че проектът използва TabActivity, който е отхвърлен. Тъй като ActionBarSherlock не предоставя своята персонализирана реализация, реших, че трябва да се използва такава, каквато е. И това беше моята грешка. След премахване на tabactivity виждам менютата и в двете версии.

Благодаря много на всички, които се опитаха да помогнат.

person Dipendra    schedule 10.07.2013