Android: 如何通过编程方式打开菜单

3

我一直在尝试为我的安卓应用添加一个功能,即当我点击一个按钮时,菜单列表应该可见:

以下是我的代码:

menu.xml:

<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.example.MainActivity" >

    <item android:id="@+id/action_onthego_sentence"
          android:title="settings"
          android:orderInCategory="100"
          app:showAsAction="never" />

</menu>

从主活动开始,点击按钮后,我会执行以下操作:
        button.setOnClickListener( new View.OnClickListener()
        {
            @Override
            public void onClick( View view )
            {
                runOnUiThread( new Runnable()
                {
                    @Override
                    public void run()
                    {
                        openOptionsMenu();
                    }
                } );
            }
        } );

我需要的是:
如图所示,我想看到菜单已打开。有什么建议吗?

请看这个帖子可能有帮助:https://dev59.com/43A75IYBdhLWcg3wubun - K.Sopheak
6个回答

4
如果您在应用程序中使用了定制工具栏,则以下方法将非常有用:
 new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    toolbar.showOverflowMenu();
                }
            }, 500);

在工具栏案例中,不要忘记先填充菜单。然后调用showOverflowMenu(); - Bhaumik Ghodasara

2

你好,如果你正在使用工具栏,请按照以下代码进行操作:

toolbar.showOverflowMenu();

另外,你也可以直接调用

MainActivity.this.openOptionsMenu();

在工具栏的情况下,不要忘记先展开菜单。然后调用showOverflowMenu(); - Bhaumik Ghodasara

1

使用:

MainActivity.this.openOptionsMenu();

然后,检查您的工具栏是否正常。
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.acercade_activity);

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

 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        // MenuInflater inflater = getMenuInflater();
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            //case R.id.action_settings:
            //    return true;

            case R.id.perfil:
                drawerLayout.openDrawer(Gravity.LEFT);
                return true;
            default:
                return super.onOptionsItemSelected(item);



        }

    }

是的,如果MainActivity扩展了“Activity”类,那么它可以正常工作,但是奇怪的是,如果它扩展了“AppCompatActivity”,它就不能正常工作。对此有什么想法吗? - KTB
检查新的更新,你的问题是工具栏。@nick - josedlujan

1
在您的菜单布局中使用以下内容:
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:title="Setting"
app:showAsAction="ifRoom" />

0

尝试以下解决方案,它将显示在按钮上单击时菜单列表应该可见:

res/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_changeLang"
        android:orderInCategory="100"
        android:title="Change Lang" />
    <item
        android:id="@+id/action_color"
        android:orderInCategory="100"
        android:title="Select color" />
    <item
        android:id="@+id/action_applist"
        android:orderInCategory="100"
        android:title="App List" />
</menu>

MainActivity.java

@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;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    switch (id) {
        case R.id.action_changeLang:
            // Add your code
            break;
        case R.id.action_color:
            // Add your code
            break;
        case R.id.action_applist:
            // Add your code
            break;
    }
    return super.onOptionsItemSelected(item);
}

尝试使用上面的解决方案。对我来说有效。


0
使用Activity.openOptionsMenu()方法来程序化地打开菜单,但你可能需要添加延时调用它。示例如下:
new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        openOptionsMenu();
    }
}, 1000);  

如果您需要自动打开子菜单,则可以在打开选项菜单后调用menu.performIdentifierAction,例如下面的示例:
new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        openOptionsMenu();

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                mainMenu.performIdentifierAction(R.id.submenu, 0);
            }
        }, 500);
    }
}, 1000);  

Android开发效率工具:https://play.google.com/store/apps/details?id=cn.trinea.android.developertools

Android开源项目:https://p.codekk.com/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接