SherlockFragment onCreateOptionsMenu не се обажда

В моето приложение имам клас, който разширява SherlockFragmentActivity. В рамките на това действие зареждам четири класа, които разширяват SherlockFragment, който се представя като Tabs с помощта на 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() във Fragment. Това е мястото, което не ми се случва. Може да сте внедрили 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;

а не тези на android OS!

Също така опитайте да извикате 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);
}

И това всичко.

Това не е много чисто решение и трябва да бъде коригирано в библиотеката. :)

Благодаря, Wooram

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