Android 安卓的工具栏和菜单快把我逼疯了

Android 安卓的工具栏和菜单快把我逼疯了,android,android-studio,android-layout,android-toolbar,android-menu,Android,Android Studio,Android Layout,Android Toolbar,Android Menu,我在ActivityXML文件中制作了一个工具栏(为了简洁起见被剪掉了) 这就是令人沮丧的地方。未调用上述覆盖。我做了大量的搜索,发现一个人建议修改活动类声明 他说,将“扩展活动”改为“扩展活动” 我检查了我的类声明,它已经是AppCompat了。一时兴起,我把它改成了活动 通过此更改,我现在可以在调试器中看到我的覆盖被调用。是的 但是我的菜单不见了 在我的activity.class中有以下几行文字(为了简洁起见剪掉): 由于这不再有效,我删除了toolbar.inflateMenu(),将其

我在ActivityXML文件中制作了一个工具栏(为了简洁起见被剪掉了)

这就是令人沮丧的地方。未调用上述覆盖。我做了大量的搜索,发现一个人建议修改活动类声明

他说,将“扩展活动”改为“扩展活动”

我检查了我的类声明,它已经是AppCompat了。一时兴起,我把它改成了活动

通过此更改,我现在可以在调试器中看到我的覆盖被调用。是的

但是我的菜单不见了

在我的activity.class中有以下几行文字(为了简洁起见剪掉):

由于这不再有效,我删除了toolbar.inflateMenu(),将其替换为getMenuInflater(),并将其置于覆盖中,如下所示

@Override
public boolean onCreateOptionsMenu (Menu menu) {
    super.onCreateOptionsMenu( menu );
    getMenuInflater().inflate( R.menu.home_mainmenu, menu );
    return false;
}
没有快乐

我也试过:

@Override
public boolean onPrepareOptionsMenu (Menu menu) {
    super.onPrepareOptionsMenu( menu );
    getMenuInflater().inflate( R.menu.home_mainmenu, menu );
    this.menu = menu;
    return false;
}
还是没有快乐

在上面的两个覆盖中,我还尝试替换getMenuInflater。。。。用于工具栏。充气菜单

没有快乐

我想要的是一个常规的工具栏,它有一个右对齐的标准按钮,有三个垂直的点,点击时会显示一个菜单

在这一点上,我是无知的,所以让我在结束之前先对有解决办法的天使说声谢谢

还有人认为这是不必要的困难吗?。。。。。再说一遍,蒂娅

  • 我建议应用
    androidX
    迁移。所以
    工具栏
    包将
    androidx.appcompat.widget.Toolbar
    和父活动的
    androidx.appcompat.app.AppCompatActivity
  • 确保活动主题未继承自
    theme.AppCompat.NoActionBar

  • 使用
    setSupportActionBar(工具栏)
    method而不是
    setActionBar
    中的
    onCreate
    或内部重写的
    setContentView
    方法

  • super.onCreateOptions菜单(菜单)
    之前对自定义菜单进行充气:

    有了这样的设置,它应该可以工作


  • 我终于明白了。重复一下,我正在使用这个库:

    导入android.widget.Toolbar

    因为我想使用活动,而不是AppCompatActivity

    因此xml声明如下所示:

    因为我们使用的是工具栏,所以我们必须删除Android提供给我们的默认操作栏。这需要编辑应用程序清单。 任何您找到“AppTheme.ActionBar”的地方,请更改为“AppTheme.NoActionBar”

    在java类中,我有:

    protected void onCreate(Bundle savedInstanceState) {
            Toolbar toolbar = findViewById(R.id.mytoolbar);
            setActionBar( toolbar );
    }
    
    请注意“setActionBar”的用法与“setSupportActionBar”的用法相反。这是正确的

    然后是(最后!)正确编码的覆盖,无论您选择什么导入库,它都可能为任何人提供信息:

        @Override
        public boolean onPrepareOptionsMenu (Menu menu) {
            super.onPrepareOptionsMenu( menu );
            if ( !bMenuInitialized ) {
                this.menu = menu;
                getMenuInflater().inflate( R.menu.home_mainmenu, menu );
                bMenuInitialized = true;
            }
            /*
            invalidateOptionsMenu();
            toolbar.inflateMenu( R.menu.home_mainmenu );
             */
            return true;
        }
    
    我在评论区留下了不该做的事。调用invalidateOptionsMenu()会导致无限循环,这在internet上随处可见。不要那样做。。。。。如果您以某种方式更改了菜单,则只能从其他代码块调用InvalidateOptions菜单。这就是工具栏无法显示的原因。(我所说的“更改菜单”并不是指在菜单项上设置属性。)

    我还了解到,您必须创建一个标志来指示菜单是否已膨胀,因为每次用户访问工具栏时都会调用onPrepareOptions菜单()。你不想每次都不断地膨胀你的菜单,因为它只是增加了已经在菜单中的菜单,使它越来越长


    给你。我希望这对某人有帮助。感谢所有回答您的人。

    请在以后为您的问题提供一个有效的标题,这无助于任何人理解您想要达到的目的,标题应该描述问题,而不使用不必要的信息。
    @Override
    public boolean onCreateOptionsMenu (Menu menu) {
        super.onCreateOptionsMenu( menu );
        getMenuInflater().inflate( R.menu.home_mainmenu, menu );
        return false;
    }
    
    @Override
    public boolean onPrepareOptionsMenu (Menu menu) {
        super.onPrepareOptionsMenu( menu );
        getMenuInflater().inflate( R.menu.home_mainmenu, menu );
        this.menu = menu;
        return false;
    }
    
    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        menuInflater.inflate(/*menu res id*/)
        this.menu = menu;
        return super.onCreateOptionsMenu(menu)
    }
    
    protected void onCreate(Bundle savedInstanceState) {
            Toolbar toolbar = findViewById(R.id.mytoolbar);
            setActionBar( toolbar );
    }
    
        @Override
        public boolean onPrepareOptionsMenu (Menu menu) {
            super.onPrepareOptionsMenu( menu );
            if ( !bMenuInitialized ) {
                this.menu = menu;
                getMenuInflater().inflate( R.menu.home_mainmenu, menu );
                bMenuInitialized = true;
            }
            /*
            invalidateOptionsMenu();
            toolbar.inflateMenu( R.menu.home_mainmenu );
             */
            return true;
        }