Reputation: 2249
I'm trying to add a menu to the ToolBar.
onCreateOptionsMenu
method of my Activity
is called, but no menu appears.
This is dashboard.xml (from menu folder)
<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context="com.app.android.ui.dashboard.DashboardActivity">
<item
android:id="@+id/action_scan_qr"
android:icon="@drawable/ic_drawer"
android:title="@string/menu_scan_qr"
app:showAsAction="always" />
</menu>
NOTE: icon of this menu is darker than the background color of the action bar, so it should be visible.
Inflating menu in Activity:
public class DashboardActivity extends ActionBarActivity {
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
getMenuInflater().inflate(R.menu.dashboard, menu);
return true;
}
And the main theme for the application:
<style name="Theme.Application.Base" parent="Theme.AppCompat.Light">
<item name="colorPrimary">@android:color/white</item>
<item name="colorPrimaryDark">@android:color/white</item>
<item name="android:windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="drawerArrowStyle">@style/Theme.Application.DrawerArrowStyle</item>
<item name="android:textColorSecondary">@android:color/darker_gray</item>
</style>
Why onCreateOptionsMenu
is called but menu doesn't appears. I'm using appcompat-v7:21.0.3
EDIT:
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getContentViewId());
toolbar = (Toolbar) findViewById(R.id.tool_bar);
if (toolbar == null) {
throw new Error("Can't find tool bar, did you forget to add it in Activity layout file?");
}
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
}
Upvotes: 37
Views: 85286
Reputation: 2249
I'm not sure why, but when I place everything related menu inflating in onCreateOptionsMenu method, everything works fine.
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
getMenuInflater().inflate(R.menu.dashboard, menu);
return super.onCreateOptionsMenu(menu);
}
Upvotes: 35
Reputation: 11
Another place to check that can disable the action bar is your themes. By default in Android Studio it gives you the Material3 light theme that does not support action bars. Replace that theme with one that does. You'll be able to find the folder at:
res/values/themes/themes.xml
Next in the file it should be on the same line as the:
<style name="Base.Theme.<AppName>" parent="<Material3 or other theme that disables action bar>">
And just replace the parent theme with one that does support action bars.
Upvotes: 1
Reputation: 191
In my case it was overlapping of views, and click get over by another view. (ps. Check xml closely)
Upvotes: 0
Reputation: 3737
Overwriting onCreateOptionsMenu
fixes the issue, but when you want to inject a different menu into Fragments then in the Activity, the onCreateOptionsMenu()
and onPrepareOptionsMenu()
methods are Deprecated
there.
Instead, implement the new MenuProvider
interface and link this menu provider in the Activity with addMenuProvider()
and add a different MenuProvider
in the Fragment
:
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
...
setSupportActionBar(findViewById(R.id.toolbar))
addMenuProvider(MenuProvider())
}
private class MenuProvider : androidx.core.view.MenuProvider {
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
menuInflater.inflate(R.menu.fragment1, menu)
}
override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
TODO("Not yet implemented")
}
}
}
Fragment
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val menuHost: MenuHost = requireActivity()
menuHost.addMenuProvider(object : MenuProvider {
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
menuInflater.inflate(R.menu.trips, menu)
}
override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
TODO("Not yet implemented")
}
}, viewLifecycleOwner, Lifecycle.State.RESUMED)
...
}
Upvotes: 0
Reputation: 354
If nothing works then try the following :
Add following line in onCreateView()
method
setHasOptionsMenu(true)
Also add below line in onViewCreated()
method
(activity as AppCompatActivity?)!!.setSupportActionBar(customToolbar as Toolbar?)
Where customToolBar is the id of the toolbar added in xml file
Upvotes: 0
Reputation: 3928
Late to the answer, Hope this will save your a lot of code. You don't need to add Toolbar
into the XML
file if your parent theme is in the style, not a Theme.MaterialComponents.DayNight.NoActionBar
, If you have Theme.MaterialComponents.DayNight.DarkActionBar
as a parent in your theme.xml
or style.xml
, Furthermore you can add a particular theme to your activity.
Step 1: Create a menu
folder under res
if not exist and then create a menu item i.e item_menu
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:title="Setting"
app:showAsAction="always"
android:icon="@drawable/ic_baseline_settings_24"
android:id="@+id/action_setting"/>
</menu>
STEP 2: To show the menu on the default toolbar, add the below method in your activity
//To show or inflate menu on the toolbar
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.item_menu, menu)
return true
}
Step 3: To handle click events, add the below method.
//Handle the click event on the menu item option
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.action_setting -> {
//DO YOUR STUFF HERE
}
}
return false
}
NOTE: YOU DON'T NEED TO ADD A TOOLBAR
INTO THE XML
FILE.
Upvotes: 1
Reputation: 91
Using XML Code
app:menu="menu_name"
Using java code
public class MainActivity extends AppCompatActivity {
private Toolbar toolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
getMenuInflater().inflate(R.menu.demo_menu,menu);
return super.onCreateOptionsMenu(menu);
}
}
Full article on adding navigation icon , subtitle ,title , brand logo to the toolbar you must go through https://bedevelopers.tech/android-toolbar-implementation-using-android-studio/
Upvotes: 0
Reputation: 1235
I was also facing the same problem, but the actual error was, i forgot to introduce toolbar in java activity
under AppCompactActivity
, under on create method define your toolbar by id and call setSupportActionBar(ToolBar);
Example is below:
public class secondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
toolbar.showOverflowMenu();
Upvotes: 45
Reputation: 31
Ensure that your toolbar initialization comes after adding the xml layout file like this:
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar1);
setSupportActionBar(toolbar);
Upvotes: 3
Reputation: 62519
You need to inflate your menu in onCreateOptionsMenu of the activity:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.mymenu, menu);
return super.onCreateOptionsMenu(menu);
}
Upvotes: 6
Reputation: 451
I had written like,
MenuInflater(this).inflate(R.menu.my_menu, menu)
But, I changed the code like,
menuInflater.inflate(R.menu.my_menu, menu)
and it worked!
(I'm using kotlin and this code was written in Activity)
Upvotes: 0
Reputation: 446
Although the accepted answer does work, it causes my menu items rendered twice. As I've just worked around this, try somethings as:
return true;
instead of super.onCreateOptionsMenu(menu);
setSupportActionBar(findViewById(R.id.toolbar))
getSupportActionBar().setDisplayShowTitleEnabled(false)
Upvotes: 0
Reputation: 994
Add Icon you want under mipmap folder
Create menu_analysis.xml(under menu folder values.xml)
<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context="com.app.android.ui.dashboard.DashboardActivity">
<item
android:id="@+id/action_scan_qr"
android:icon="@mipmap/ic_menu_options"
android:title=""
app:showAsAction="always" />
</menu>
Now onPrepareOptionMenu under your Java class
@Override
public boolean onPrepareOptionsMenu(final Menu menu) {
getMenuInflater().inflate(R.menu.menu_analysis, menu);
return super.onCreateOptionsMenu(menu);
}
Upvotes: 0
Reputation: 101
In my case it was stupid simple. My toolbar was a child of AppBarLayout, and for some reason, when I was setting a Toolbar with Constraint layout, Toolbar's layout_width xml parameter was set to 0dp. So the toolbar was there, but invisible... (>_<)
So, if nothing from above helped you, just check "layout_width" and "layout_height" parameters.
Hope this will save someone's time :)
Upvotes: 1
Reputation: 1217
If you are inflating your menu from a fragment, e.g. by overriding onCreateOptionsMenu
method, make sure to call setHasOptionsMenu(true)
in onCreateView
of your fragment
Upvotes: 8
Reputation: 798
The issue is resolved when I changed it to app:showAsAction to android:showAsAction
Upvotes: 0
Reputation: 971
Try the following:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context="com.example.lolipoptest.MainActivity" >
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:showAsAction="never"
android:title="@string/action_settings"/>
</menu>
and the Java Code:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
Upvotes: 11
Reputation: 7753
Do you have Toolbar in your dashboard layout ?. Call setSupportActionBar(toolbar) in your activity. Use Theme.AppCompat.NoActionBar theme for the activities (If you are using toolbar in it)
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
public class DashboardActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.dashboard, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
Check your styles.
<resources>
<!-- Base application theme. -->
<style name="AppTheme.Base" parent="Theme.AppCompat.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="android:windowBackground">@color/white</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="AppTheme" parent="AppTheme.Base">
</style>
<style name="ToolbarTheme" parent="AppTheme" >
</style>
<color name="light">#FFBB33</color>
<color name="colorPrimary">#FFBB33</color>
<color name="textColorPrimary">#FFBB33</color>
<color name="colorPrimaryDark">#FF8800</color>
<color name="colorAccent">#ff9977</color>
<color name="white">#ffffff</color>
</resources>
Check your layout.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize"
app:titleMarginStart="20dp"
android:paddingRight="10dp"
android:background="@color/colorPrimaryDark"
app:theme="@style/ToolbarTheme" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:text="Hello Toolbar" />
</LinearLayout>
Add theme in your activity in manifest
android:theme="@style/AppTheme"
Upvotes: 8
Reputation: 3726
If you're using a Toolbar
you need to set it as the support action bar in onCreate
:
setSupportActionBar(toolbar);
Upvotes: 1
Reputation:
Try changing:
....
xmlns:app="http://schemas.android.com/apk/res-auto" >
....
app:showAsAction="ifRoom"
to:
....
xmlns:yourapp="http://schemas.android.com/apk/res-auto" >
....
yourapp:showAsAction="ifRoom"
https://developer.android.com/training/basics/actionbar/adding-buttons.html
Upvotes: 1