Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add Action bar options menu in Android Fragments

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);        }     }     } 
like image 342
Karthik Sekar Avatar asked Sep 10 '13 08:09

Karthik Sekar


People also ask

How do I get the activity toolbar in fragment?

if you are using custom toolbar or ActionBar and you want to get reference of your toolbar/action bar from Fragments then you need to first get instance of your Main Activity from Fragment's onCreateView Method like below. ImageView vRightBtn = activity. toolbar.

How do you add action items to the action bar in Android?

All action buttons and other items available in the action overflow are defined in an XML menu resource. To add actions to the action bar, create a new XML file in your project's res/menu/ directory. The app:showAsAction attribute specifies whether the action should be shown as a button on the app bar.


2 Answers

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)

like image 180
flx Avatar answered Oct 14 '22 13:10

flx


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);     } 
like image 25
Pankaj Avatar answered Oct 14 '22 13:10

Pankaj