在通过 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

  1. import androidx.appcompat.widget.Toolbar 而不是 @Mayur Gajra
  2. 所说的 import android.widget.Toolbar;
  3. 初始化 androidx.appcompat.widget.Toolbar mToolbar 而不是 android.widget.Toolbar mToolbar
  4. 设置mToolbar = (androidx.appcompat.widget.Toolbar) findViewById(R.id.toolbar); 而不是 mToolbar = findViewById(R.id.toolbar);
  5. 使用setSupportActionBar(mToolbar);代替setActionBar(mToolbar);

B->在v21\toolbar.xml

  1. <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

准确指出的