如何点击子菜单进入主菜单?

时间:2017-12-12 11:02:55

标签: android menu submenu

如何在android中的子onclick上转到主菜单menu。我正在尝试这个但却无法做到这一点。

这是java

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    sub = menu.getItem(0).getSubMenu();
    sub.setHeaderTitle("sub menu...");
    sub.setHeaderIcon(R.drawable.ic_voice);
    //Toast.makeText(this, "submenu label=", Toast.LENGTH_SHORT).show();
    MenuItem item = menu.findItem(R.id.action_settings);
    TextView iv= (TextView) item.getActionView().findViewById(R.id.action_settings);

    sub.getItem(0).setActionView(iv);
    Toast.makeText(this, "before onclick listener=", Toast.LENGTH_SHORT).show();
    iv.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Toast.makeText(v.getContext(), "-submenu header title clicked", Toast.LENGTH_SHORT).show();
        }
    });
    return super.onPrepareOptionsMenu(menu);
}

这是我的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">

    <item
        android:id="@+id/action_refresh"
        android:orderInCategory="100"
        android:title="Refresh" />
    <item
        android:id="@+id/action_settings"
        android:icon="@drawable/ic_voice"
        android:title="Settings"
        app:actionViewClass="android.widget.TextView">

        <menu>
            <item
                android:id="@+id/change_password"
                android:title="change password" />

            <item
                android:id="@+id/user_details"
                android:title="user details" />
        </menu>
    </item>
</menu>

image代码

当我们点击submenu文字时,

显示为submenu它应该返回mainmenu

1 个答案:

答案 0 :(得分:0)

Android没有提供将onClickListener设置为SubMenu标头的某种机制,但您可以使用黑客攻击。

首先,摆脱SubMenu标题:

SubMenu sub = menu.findItem(R.id.action_settings).getSubMenu(); 
sub.clearHeader();

使用getItem(0)并不安全,因为您商品的顺序可能会发生变化,因此我使用了findItem(R.id.action_settings)

接下来,您应该再向item添加一个SubMenu

<menu>
        <item
            android:id="@+id/sub_title"
            android:title="sub menu..."/>

        <item
            android:id="@+id/change_password"
            android:title="change password" />

        <item
            android:id="@+id/user_details"
            android:title="user details" />
</menu>

但现在所有三个items看起来都一样,所以你需要改变第一个MenuItem的颜色

MenuItem headItem = sub.findItem(R.id.sub_title);
SpannableString s = new SpannableString(headItem.getTitle());
s.setSpan(new ForegroundColorSpan(Color.GRAY), 0, s.length(), 0);
headItem.setTitle(s);

此外,不要将onPrepareOptionsMenu()用于此目的,因为每次打开menu时都会调用,您可以将所有代码放在onCreateOptionsMenu()中:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);

    SubMenu sub = menu.findItem(R.id.action_settings).getSubMenu();
    sub.clearHeader();

    MenuItem headItem = sub.findItem(R.id.sub_title);
    SpannableString s = new SpannableString(headItem.getTitle());
    s.setSpan(new ForegroundColorSpan(Color.GRAY), 0, s.length(), 0);
    headItem.setTitle(s);

    return true;
}

最后一步 - 听取点击MenuItem

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch(item.getItemId()) {

        case R.id.sub_title:
            Toast.makeText(this, "-submenu header title clicked", Toast.LENGTH_SHORT).show();
            return true;

    }
    return false;
}