Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android Lollipop, add popup menu from title in toolbar

I'm unable to see how adding a popup menu from the title is accomplished like is shown in many of the material design examples. Any help would be much appreciated.

Toolbar Popup From Title

like image 959
Matt Wear Avatar asked Oct 22 '14 15:10

Matt Wear


People also ask

Which method is used to add menu to the toolbar in Android Studio?

This is going to be in res/menu/main_menu . Right click the res folder and choose New > Android Resource File. Type main_menu for the File name. Choose Menu for the Resource type.


2 Answers

You're going to need to add a Spinner to the Toolbar:

<android.support.v7.widget.Toolbar         android:id="@+id/toolbar"         android:layout_height="?attr/actionBarSize"         android:layout_width="match_parent"         android:background="?attr/colorPrimary">      <Spinner             android:id="@+id/spinner_nav"             android:layout_width="wrap_content"             android:layout_height="wrap_content" />  </android.support.v7.widget.Toolbar> 

You will then need to disable the default title:

Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayShowTitleEnabled(false); 

You can then retrieve and setup the Spinner as needed in your Activity/Fragment.

like image 175
Chris Banes Avatar answered Oct 17 '22 12:10

Chris Banes


I came across this question while I was trying to find a solution to prevent the popup to overlay the spinner and I would like to leave here an alternative solution to this question as its possible to add the spinner to the toolbar using the menu.xml as well

activity_main.xml

<LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"  android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">  <android.support.design.widget.AppBarLayout     android:layout_width="match_parent"     android:layout_height="wrap_content"     android:fitsSystemWindows="true">      <android.support.v7.widget.Toolbar         android:id="@+id/toolbar"         android:layout_width="match_parent"         android:layout_height="?attr/actionBarSize"         android:background="?attr/colorAccent" />  </android.support.design.widget.AppBarLayout>   <!-- Other layout widgets -->  </LinearLayout> 

menu_main.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto">  <item     android:id="@+id/spinner"     android:title="Spinning"     app:actionViewClass="android.widget.Spinner"     app:showAsAction="always" />  <!-- Other items -->  </menu> 

Your Activity

It will be necessary to override the onCreateOptionMenu() method, then use getMenuInflater() to inflate the menu file created earlier.

You will also need to get the Spinner item and set an adapter to it as you would normally do.

   @Override public boolean onCreateOptionsMenu(Menu menu) {      getMenuInflater().inflate(R.menu.menu_main, menu);      //Get Spinner item from menu      MenuItem spinnerMenuItem = menu.findItem(R.id.spinner);     final Spinner spinner = (Spinner) MenuItemCompat.getActionView(spinnerMenuItem);      //Set adapter whichever way you prefer (from the resource or manually)      final ArrayAdapter<CharSequence> spinnerAdapter = ArrayAdapter             .createFromResource(this, R.array.items_array, android.R.layout.simple_spinner_dropdown_item);     spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);     spinner.setAdapter(spinnerAdapter);      return true;  } 

Style.xml

Finally, if you want to customize your spinner

<resources>  <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">     <item name="android:spinnerStyle">@style/spinner_style</item> </style>  <style name="spinner_style" parent="Widget.AppCompat.Spinner">     <item name="android:dropDownVerticalOffset">40dip</item>     <!--<item name="android:dropDownHorizontalOffset">0dip</item>-->     <item name="overlapAnchor">false</item>      <!--Other customizations-->  </style> 

like image 36
Ruan_Lopes Avatar answered Oct 17 '22 12:10

Ruan_Lopes