SherlockFragment onCreateOptionsMenu не вызывает

В моем приложении есть класс, расширяющий SherlockFragmentActivity. В этом действии я загружаю четыре класса, расширяющих SherlockFragment, которые притворяются вкладками с помощью ActionbarSherlock. и PagerSlidingTabStrip.

Классы, расширяющие SherlockFragment, имеют setHasOptionsMenu(true); внутри onCreate() метод. Даже при этом при запуске приложение не будет вызывать метод onCreateOptionsMenu().

Я прочитал эти похожие вопросы (Q1, Q2) в SO и не получил никакой помощи .

Что может быть причиной этого?


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setHasOptionsMenu(true);

}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    menu.clear();
    inflater.inflate(R.menu.record, menu);
    super.onCreateOptionsMenu(menu, inflater);
    Log.i(TAG, "* onCreateOptionsMenu");
}

ОБНОВЛЕНИЕ:

Я думаю, причина в том, что я использую SherlockFragment внутри другого SherlockFragment. Означает в PageSlidingTabStripFragment. java имеет следующий метод внутри класса MyPagerAdapter.

@Override
public SherlockFragment getItem(int position) {
    return SuperAwesomeCardFragment.newInstance(position);
}

Что я делаю, так это вызываю некоторые другие SherlockFragments, как показано ниже.

@Override
public SherlockFragment getItem(int position) {
    Log.i(TAG, "* getItem");

    switch (position) {
        case 0:
            return new InnerSherlockFragmentOne();
        case 1:
            return new InnerSherlockFragmentTwo();
        case 2:
            return new InnerSherlockFragmentThree();
        case 3:
            return new InnerSherlockFragmentFour();
        default:
            return null;
    }
}

То, что не вызывается, это onCreateOptionsMenu (меню меню, инфлятор MenuInflater) внутри этих InnerSherLockFragments.


comment
Возможно, вы забыли добавить menu.clear() перед раздуванием меню.   -  person Naddy    schedule 19.11.2013
comment
@Naddy Нет... Я говорю, что onCreateOptionsMenu() даже не звонил. Если я помещу сообщение Log в этот метод в качестве первой строки, оно не будет напечатано.   -  person AnujAroshA    schedule 19.11.2013
comment
@Naddy добавила к вопросу сейчас   -  person AnujAroshA    schedule 19.11.2013
comment
Я реализовал тот же код, и он работает для меня. Единственное отличие состоит в том, что я создал MenuItems программно. Вы используете MapFragment??   -  person Naddy    schedule 19.11.2013
comment
@Naddy Я не использую MapFragment. Я тоже могу создать MenuItems программно. Но чтобы создать MenuItems программно, нам нужно запустить onCreateOptionsMenu() внутри фрагмента. Это то место, которое не происходит со мной. Возможно, вы реализовали MenuItems внутри SherlockFragmentActivity, а не SherlockFragment ИЛИ вы не можете создавать разные MenuItems для разных фрагментов. Кстати, спасибо, что поделились своим опытом.   -  person AnujAroshA    schedule 19.11.2013
comment
давайте продолжим это обсуждение в чате   -  person AnujAroshA    schedule 20.11.2013
comment
Это не решение. Но я добился этого, удалив ActionbarSherlock и используя только PageSlidingTabStrip.   -  person AnujAroshA    schedule 26.11.2013


Ответы (3)


Импорт должен быть:

import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;

а не эти андроид ОС!

Также попробуйте вызвать метод super, например:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    menu.clear();
    inflater.inflate(R.menu.record, menu);

    Log.i(TAG, "* onCreateOptionsMenu");
}
person madlymad    schedule 19.11.2013
comment
@AnujAroshA вы уверены, что активность не отключает меню? добавьте методы также к активности, чтобы проверить, работает ли она... - person madlymad; 19.11.2013
comment
На самом деле, если я создаю элементы меню в onCreateOptionsMenu() внутри своего класса Activity, который расширяет SherlockFragmentActivity, он будет отображаться в меню. Но тогда я не могу изменить пункты меню в соответствии с изменениями фрагмента. Вот почему я пытаюсь реализовать пункты меню внутри каждого действия фрагмента. - person AnujAroshA; 19.11.2013

Недавно у меня была такая же проблема. И мой код очень похож на ваш, я использую Fragment в PagerSlidingTabStrip...

Мое решение примерно такое.

Я ничего не делаю в своем фрагменте, но исправляю исходный код из PageSlidingTabStripFragment.java

PageSlidingTabStripFragment.java

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
    adapter = new MainPagerAdapter(getChildFragmentManager());
    setHasOptionsMenu(true);
setRetainInstance(true);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    Log.e("test", "Fragment onCreateOptionsMenu");
    int position = pager.getCurrentItem();

    if (position == 4) {
        inflater.inflate(R.menu.fragment_report_menu, menu);
    }

    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.board_list_menu_new:
            ReportFragment fragment = (ReportFragment) adapter.getItem(pager.getCurrentItem());
            fragment.onMyOptionItemSelected();
            break;
    }
    return super.onOptionsItemSelected(item);
}

И все.

Это не очень чистое решение и должно быть исправлено в библиотеке. :)

Спасибо, Вурам

person Wooram Jung    schedule 11.03.2014

Это точный код, который я написал, и он отлично работает.

import android.os.Bundle;
import android.util.Log;

import com.actionbarsherlock.app.SherlockFragment;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;

public class First extends SherlockFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        setHasOptionsMenu(true);

        super.onCreate(savedInstanceState);
        Log.i("TAG", "* created");
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        menu.clear();
        menu.add("abcd").setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
        menu.add("efgh").setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);

        Log.i("TAG", "* onCreateOptionsMenu");
    }
}
person Naddy    schedule 19.11.2013
comment
Я обновил вопрос. Пожалуйста, добавьте свой опыт в этом. Спасибо - person AnujAroshA; 21.11.2013