64

I am trying to have a options menu in Android Fragments. ActionBar options menu are not displaying in my Fragments.

Here is my code and I have both onCreateOptionsMenu() and onOptionSelected() function. My code doesn't shows any error. But options menu are not displaying.

package org.reachout;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;

import org.general.R;

public class ViewMessageFragment extends Fragment {

    /* (non-Javadoc)
     * @see android.support.v4.app.Fragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle)
     */
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        if (container == null) {
            // We have different layouts, and in one of them this
            // fragment's containing frame doesn't exist.  The fragment
            // may still be created from its saved state, but there is
            // no reason to try to create its view hierarchy because it
            // won't be displayed.  Note this is not needed -- we could
            // just run the code below, where we would create and return
            // the view hierarchy; it would just never be used.
            return null;
        }
        return (LinearLayout)inflater.inflate(R.layout.viewmessages_tab_fragment_layout, container, false);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        // TODO Auto-generated method stub
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.askexperts_menu, menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
       // handle item selection
       switch (item.getItemId()) {
          case R.id.action_settings:
             // do s.th.
             return true;
          default:
             return super.onOptionsItemSelected(item);
       }
    }   

}
Pankaj
  • 7,908
  • 6
  • 42
  • 65
Karthik Sekar
  • 665
  • 1
  • 5
  • 10
  • 1
    It worked for me, I was using setHasOptionsMenu(true); in onCreateView instead of onCreate. calling setHasOptionsMenu(true); from onCreate solved my problem. – MTahir Mar 29 '14 at 20:49
  • It has nothing to do with the activity that is associated with fragment? I mean that no code has to be written in the activity for showing the menu. Just the fragment has to attached to the activity. Please reply asap. – sanidhya pal Apr 28 '17 at 15:44

3 Answers3

94

You need to call setHasOptionsMenu(true) in onCreate().

For backwards compatibility it's better to place this call as late as possible at the end of onCreate() or even later in onActivityCreated() or something like that.

See: https://developer.android.com/reference/android/app/Fragment.html#setHasOptionsMenu(boolean)

flx
  • 14,146
  • 11
  • 55
  • 70
  • thanks. But i have got this working in Android 4.0+. But not on my Android Gingerbread 2.3.3 version and above for some reason. I have updated my code above. Please help me to get this fixed in Android 2.3.3 and above also. – Karthik Sekar Sep 10 '13 at 09:06
  • 3
    Move the `setHasOptionsMenu(true)` at the end of `onCreateView()`. Like `View v = inflater.inflate(); setHasOptionsMenu(true); return v;` – flx Sep 10 '13 at 09:09
  • I have tried as you said. But still its not display in Android Gingerbread. – Karthik Sekar Sep 10 '13 at 09:19
  • 1
    It didn't work for me either with ABS on 4.4. Instead, I went a different route. My fragments were in a FragmentPagerAdapter, and I just added and removed a menu item dynamically in onPageSelected(). – Eduard Feb 18 '14 at 23:10
  • I have added setHasOptionMenu(true) in onCreate method of the fragment. Also have inflated menu as explain in the question. But i got option menu when user click on the Menu button. I would like to have it in the ActionBar with in the fragment. So how to achieve that? – Shreyash Mahajan Feb 25 '15 at 12:53
  • Thanks a lot! It work like a charm, regardless where I place it: at the end of onCreateView() or at the end of onActivityCreated(). – pinyin_samu Apr 16 '15 at 12:14
  • If you see Gmail app in Tablet, it has list Menu items placed just above the list and message view menu items at right corner. How to achieve that functionality? – Faizan Mubasher Mar 22 '16 at 15:04
  • 1
    @iDroidExplorer set 'app:showAsAction="always" in your menu item – Akshay Mahajan Feb 16 '17 at 08:24
89

I am late for the answer but I think this is another solution which is not mentioned here so posting.

Step 1: Make a xml of menu which you want to add like I have to add a filter action on my action bar so I have created a xml filter.xml. The main line to notice is android:orderInCategory this will show the action icon at first or last wherever you want to show. One more thing to note down is the value, if the value is less then it will show at first and if value is greater then it will show at last.

filter.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" >


    <item
        android:id="@+id/action_filter"
        android:title="@string/filter"
        android:orderInCategory="10"
        android:icon="@drawable/filter"
        app:showAsAction="ifRoom" />


</menu>

Step 2: In onCreate() method of fragment just put the below line as mentioned, which is responsible for calling back onCreateOptionsMenu(Menu menu, MenuInflater inflater) method just like in an Activity.

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

Step 3: Now add the method onCreateOptionsMenu which will be override as:

@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.filter, menu);  // Use filter.xml from step 1
    }

Step 4: Now add onOptionsItemSelected method by which you can implement logic whatever you want to do when you select the added action icon from actionBar:

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if(id == R.id.action_filter){
            //Do whatever you want to do 
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
Pankaj
  • 7,908
  • 6
  • 42
  • 65
-18

in AndroidManifest.xml set theme holo like this:

<activity
android:name="your Fragment or activity"
android:label="@string/xxxxxx"
android:theme="@android:style/Theme.Holo" >