SherlockFragment onCreateOptionsMenu is not calling
Asked Answered
B

3

2

In my app I'm having a class which extends SherlockFragmentActivity. Within that Activity, I'm loading four classes which extends SherlockFragment which pretends as Tabs with the help of ActionbarSherlock and PagerSlidingTabStrip.

The classes which extends SherlockFragment has setHasOptionsMenu(true); inside onCreate() method. Even having that, when run the application, it won't call onCreateOptionsMenu() method.

I have read these similar questions (Q1, Q2) in SO and didn't get any help.

What can be the reason for that?


@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");
}

UPDATE:

I think the reason is, I'm using SherlockFragment inside another SherlockFragment. Means in PageSlidingTabStripFragment.java has following method inside MyPagerAdapter class.

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

What I'm doing is, I'm calling some other SherlockFragments from there like below.

@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;
    }
}

What is not calling is onCreateOptionsMenu(Menu menu, MenuInflater inflater) inside those InnerSherLockFragments.

Brewis answered 19/11, 2013 at 9:30 Comment(7)
Maybe you forgot to add menu.clear() before inflating the menu.Glowworm
@Glowworm No... I'm telling that onCreateOptionsMenu() not even call. If I put a Log message inside that method as first line, it won't print.Brewis
@Glowworm added to the question nowBrewis
I have implemented the same code and it's working for me. The only difference being that I have created the MenuItems programmatically. Are you using MapFragment??Glowworm
@Glowworm I'm not using MapFragment. Me too can create MenuItems programmatically. But to create MenuItems programatically we need to fire onCreateOptionsMenu() inside Fragment. That is the place not happening to me. You may have implemented the MenuItems inside SherlockFragmentActivity not SherlockFragment OR you may not creating different MenuItems for different Fragments. By the way, thanks for sharing your experience.Brewis
let us continue this discussion in chatBrewis
This is not the solution. But I achieved this by removing ActionbarSherlock and using only PageSlidingTabStrip.Brewis
A
4

The imports should be:

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

and not these of android OS!

Also try calling super method like:

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

    Log.i(TAG, "* onCreateOptionsMenu");
}
Adman answered 19/11, 2013 at 10:43 Comment(2)
@Brewis are you sure that the activity on does not disable the menu? add methods also to the activity to test if it functions...Adman
Actually, if I'm creating Menu items in onCreateOptionsMenu() inside my Activity class which extends SherlockFragmentActivity it will display in the Menu. But then I'm not able to change Menu items according to the Fragment changes. That's why I'm trying to implement Menu items inside each Fragment Activity.Brewis
R
2

I had a same issue recently. And my code is very similar with yours that I use Fragment in PagerSlidingTabStrip...

My solution is something like this.

I don't do anything in my fragment but fix the source from 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);
}

And that all.

This is not very clean solution and should be fixed in library. :)

Thanks, Wooram

Rhyton answered 11/3, 2014 at 4:7 Comment(0)
G
1

This is the exact code I have written and it works fine.

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");
    }
}
Glowworm answered 19/11, 2013 at 15:48 Comment(1)
I've update the question. Please add your experience with that. ThanksBrewis

© 2022 - 2024 — McMap. All rights reserved.