SherlockFragment onCreateOptionsMenu is not callin

2019-05-26 08:12发布

问题:

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.

回答1:

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


回答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



回答3:

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

}