在通过 android studio 创建的 Android 应用中,菜单按钮未显示在工具栏上
Menu buttons not showing up on toolbar in Android app creating through androidstudio
我正在创建一个应用程序,用户可以在其中使用回收站视图中的添加项目按钮添加项目,但我还想添加应显示在工具栏上的菜单按钮...
问题
菜单按钮未显示在工具栏上。在 menu_main.xml 的设计预览中,按钮显示正确。
但是当 运行 这个应用程序在设备上时,菜单按钮没有显示。
ActivityMain 代码:(在此我在底部创建了 onCreateOptionsMenu 方法)
package com.example.foodmanagement;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
//import androidx.appcompat.widget.Toolbar;
import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.Toast;
import android.widget.Toolbar;
public class MainActivity extends AppCompatActivity {
Toolbar mToolbar;
Button mBtnAdd;
BucketRecyclerView mRecycler;
Realm mRealm;
RealmResults<Drop> mResults;
View mEmptyView ;
AdapterDrops mAdapter;
private View.OnClickListener mBtnAddListener = (v) -> {
showDialogAdd();
};
private AddListener mAddListener = new AddListener() {
@Override
public void add() {
showDialogAdd();
}
};
private RealmChangeListener mChangeListener = new RealmChangeListener() {
@Override
public void onChange(Object o) {
Log.d(TAG, "onChange: was called");
mAdapter.update(mResults);
}
};
private MarkListener mMarkListener = new MarkListener() {
@Override
public void onMark(int position) {
showDialogMarkFinish(position);
}
};
private CompleteListener mCompleteListener = new CompleteListener() {
@Override
public void onComplete(int position) {
mAdapter.markComplete(position);
}
};
private void showDialogAdd() {
DialogAdd dialog = new DialogAdd();
dialog.show(getSupportFragmentManager(),"Add");
}
private void showDialogMarkFinish(int position) {
DialogMarkFinish dialog = new DialogMarkFinish();
Bundle bundle = new Bundle();
bundle.putInt("POSITION", position);
dialog.setArguments(bundle);
dialog.setCompleteistener(mCompleteListener);
dialog.show(getSupportFragmentManager(), "Mark");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activitymain);
mRealm = Realm.getDefaultInstance();
mResults = mRealm.where(Drop.class).findAllAsync();
mToolbar = findViewById(R.id.toolbar);
mEmptyView = findViewById(R.id.empty_drops);
mRecycler = (BucketRecyclerView) findViewById(R.id.rv_drops);
mRecycler.addItemDecoration(new Divider(this, LinearLayoutManager.VERTICAL));
mRecycler.hideIfEmpty(mToolbar);
mRecycler.showIfEmpty(mEmptyView);
LinearLayoutManager manager = new LinearLayoutManager(this);
mRecycler.setLayoutManager(manager);
mAdapter = new AdapterDrops(this,mRealm, mResults, mAddListener, mMarkListener);
mRecycler.setAdapter(mAdapter);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
setActionBar(mToolbar);
}
mBtnAdd = (Button) findViewById(R.id.btn_addd);
mBtnAdd.setOnClickListener(mBtnAddListener);
SimpleTouchCallback callback = new SimpleTouchCallback(mAdapter);
ItemTouchHelper helper = new ItemTouchHelper(callback);
helper.attachToRecyclerView(mRecycler);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater=getMenuInflater ();
inflater.inflate ( R.menu.menu_main,menu );
return true;
}
@Override
protected void onStart() {
super.onStart();
mResults.addChangeListener(mChangeListener);
}
@Override
protected void onStop() {
super.onStop();
mResults.removeChangeListener(mChangeListener);
}
}
Menu_main.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">
<item
android:id="@+id/action_add"
android:icon="@drawable/ic_action_add"
android:title="Add"
app:showAsAction="always" />
<item
android:id="@+id/action_sort_descending_date"
android:title="Most Time Left" />
<item
android:id="@+id/action_sort_ascending_date"
android:title="Least Time Left" />
<item
android:id="@+id/action_show_complete"
android:title="Finished" />
<item
android:id="@+id/action_show_incomplete"
android:title="Remaining" />
</menu>
v21/toolbar.xml
<?xml version="1.0" encoding="utf-8"?>
<Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/dark_blue">
</Toolbar>
layout/toolbar.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="@dimen/abc_action_bar_default_height_material"
android:background="@android:color/white">
</androidx.appcompat.widget.Toolbar>
values/theme.xml
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.FoodManagement" parent="Theme.MaterialComponents.DayNight.NoActionBar.Bridge">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/white</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_700</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
</resources>
night/theme.xml
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.FoodManagement" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_200</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/black</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_200</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
</resources>
您需要使用 androidx
工具栏,同时在运行时分配 setSupportActionBar(mToolbar);
而不是 setActionBar
。
示例:
import androidx.appcompat.widget.Toolbar;
public class MainActivity extends AppCompatActivity {
Toolbar mToolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mToolbar = findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_main, menu);
return super.onCreateOptionsMenu(menu);
}
}
结果:
注意: 如果您想要拥有自己的操作栏,那么您也应该在 night
主题中拥有 NoActionBar
。
非常基本的错误..
A->在ActivityMain.java
import androidx.appcompat.widget.Toolbar
而不是 @Mayur Gajra 所说的 import android.widget.Toolbar;
- 初始化
androidx.appcompat.widget.Toolbar mToolbar
而不是 android.widget.Toolbar mToolbar
- 设置
mToolbar = (androidx.appcompat.widget.Toolbar) findViewById(R.id.toolbar);
而不是 mToolbar = findViewById(R.id.toolbar);
- 使用
setSupportActionBar(mToolbar);
代替setActionBar(mToolbar);
B->在v21\toolbar.xml
- 将
<Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
替换为<androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
C-> 将 Theme.AppCompat.Light.DarkActionBar
更改为 Theme.MaterialComponents.DayNight.NoActionBar.Bridge
正如@Mayur Gajra
准确指出的
我正在创建一个应用程序,用户可以在其中使用回收站视图中的添加项目按钮添加项目,但我还想添加应显示在工具栏上的菜单按钮...
问题 菜单按钮未显示在工具栏上。在 menu_main.xml 的设计预览中,按钮显示正确。
但是当 运行 这个应用程序在设备上时,菜单按钮没有显示。
ActivityMain 代码:(在此我在底部创建了 onCreateOptionsMenu 方法)
package com.example.foodmanagement;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
//import androidx.appcompat.widget.Toolbar;
import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.Toast;
import android.widget.Toolbar;
public class MainActivity extends AppCompatActivity {
Toolbar mToolbar;
Button mBtnAdd;
BucketRecyclerView mRecycler;
Realm mRealm;
RealmResults<Drop> mResults;
View mEmptyView ;
AdapterDrops mAdapter;
private View.OnClickListener mBtnAddListener = (v) -> {
showDialogAdd();
};
private AddListener mAddListener = new AddListener() {
@Override
public void add() {
showDialogAdd();
}
};
private RealmChangeListener mChangeListener = new RealmChangeListener() {
@Override
public void onChange(Object o) {
Log.d(TAG, "onChange: was called");
mAdapter.update(mResults);
}
};
private MarkListener mMarkListener = new MarkListener() {
@Override
public void onMark(int position) {
showDialogMarkFinish(position);
}
};
private CompleteListener mCompleteListener = new CompleteListener() {
@Override
public void onComplete(int position) {
mAdapter.markComplete(position);
}
};
private void showDialogAdd() {
DialogAdd dialog = new DialogAdd();
dialog.show(getSupportFragmentManager(),"Add");
}
private void showDialogMarkFinish(int position) {
DialogMarkFinish dialog = new DialogMarkFinish();
Bundle bundle = new Bundle();
bundle.putInt("POSITION", position);
dialog.setArguments(bundle);
dialog.setCompleteistener(mCompleteListener);
dialog.show(getSupportFragmentManager(), "Mark");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activitymain);
mRealm = Realm.getDefaultInstance();
mResults = mRealm.where(Drop.class).findAllAsync();
mToolbar = findViewById(R.id.toolbar);
mEmptyView = findViewById(R.id.empty_drops);
mRecycler = (BucketRecyclerView) findViewById(R.id.rv_drops);
mRecycler.addItemDecoration(new Divider(this, LinearLayoutManager.VERTICAL));
mRecycler.hideIfEmpty(mToolbar);
mRecycler.showIfEmpty(mEmptyView);
LinearLayoutManager manager = new LinearLayoutManager(this);
mRecycler.setLayoutManager(manager);
mAdapter = new AdapterDrops(this,mRealm, mResults, mAddListener, mMarkListener);
mRecycler.setAdapter(mAdapter);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
setActionBar(mToolbar);
}
mBtnAdd = (Button) findViewById(R.id.btn_addd);
mBtnAdd.setOnClickListener(mBtnAddListener);
SimpleTouchCallback callback = new SimpleTouchCallback(mAdapter);
ItemTouchHelper helper = new ItemTouchHelper(callback);
helper.attachToRecyclerView(mRecycler);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater=getMenuInflater ();
inflater.inflate ( R.menu.menu_main,menu );
return true;
}
@Override
protected void onStart() {
super.onStart();
mResults.addChangeListener(mChangeListener);
}
@Override
protected void onStop() {
super.onStop();
mResults.removeChangeListener(mChangeListener);
}
}
Menu_main.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">
<item
android:id="@+id/action_add"
android:icon="@drawable/ic_action_add"
android:title="Add"
app:showAsAction="always" />
<item
android:id="@+id/action_sort_descending_date"
android:title="Most Time Left" />
<item
android:id="@+id/action_sort_ascending_date"
android:title="Least Time Left" />
<item
android:id="@+id/action_show_complete"
android:title="Finished" />
<item
android:id="@+id/action_show_incomplete"
android:title="Remaining" />
</menu>
v21/toolbar.xml
<?xml version="1.0" encoding="utf-8"?>
<Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/dark_blue">
</Toolbar>
layout/toolbar.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="@dimen/abc_action_bar_default_height_material"
android:background="@android:color/white">
</androidx.appcompat.widget.Toolbar>
values/theme.xml
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.FoodManagement" parent="Theme.MaterialComponents.DayNight.NoActionBar.Bridge">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/white</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_700</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
</resources>
night/theme.xml
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.FoodManagement" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_200</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/black</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_200</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
</resources>
您需要使用 androidx
工具栏,同时在运行时分配 setSupportActionBar(mToolbar);
而不是 setActionBar
。
示例:
import androidx.appcompat.widget.Toolbar;
public class MainActivity extends AppCompatActivity {
Toolbar mToolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mToolbar = findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_main, menu);
return super.onCreateOptionsMenu(menu);
}
}
结果:
注意: 如果您想要拥有自己的操作栏,那么您也应该在 night
主题中拥有 NoActionBar
。
非常基本的错误.. A->在ActivityMain.java
import androidx.appcompat.widget.Toolbar
而不是 @Mayur Gajra 所说的 - 初始化
androidx.appcompat.widget.Toolbar mToolbar
而不是android.widget.Toolbar mToolbar
- 设置
mToolbar = (androidx.appcompat.widget.Toolbar) findViewById(R.id.toolbar);
而不是mToolbar = findViewById(R.id.toolbar);
- 使用
setSupportActionBar(mToolbar);
代替setActionBar(mToolbar);
import android.widget.Toolbar;
B->在v21\toolbar.xml
- 将
<Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
替换为<androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
C-> 将 Theme.AppCompat.Light.DarkActionBar
更改为 Theme.MaterialComponents.DayNight.NoActionBar.Bridge
正如@Mayur Gajra