3

所以,我试图模仿潘多拉的菜单:

潘多拉的菜单功能

无论哪种方式,您都可以选择点击右上角的菜单按钮或图标,它将显示相同的下拉菜单列表。我尝试创建一个“溢出”菜单,但在旧设备上我发现菜单仍然出现在底部(我不想要)。所以我创建了一个Spinner并使用了:

getSupportActionBar().setNavigationMode(getSupportActionBar().NAVIGATION_MODE_LIST);

这种方法的问题在于它显示的是项目的名称而不是图标(我假设我必须提供一个不成问题的图标)并且微调器显示更多朝向中间(我想要它全部向右)。

所以,总而言之,有没有一种方法可以创建一个类似于 Pandora 的菜单,它在最右侧显示一个图标,ActionBar并且可以通过按下图标或菜单按钮来打开?任何建议、提示或帮助将不胜感激,谢谢!

4

2 回答 2

1

通过一些实验,我设法完成了我想要完成的部分工作。我不确定这是否是最好的方法,但它确实有效。

我发现微调器不会显示在屏幕最右侧的原因是因为该空间是为菜单项保留的。如果您还记得,我不使用菜单项的最初原因是因为在旧设备上,当您点击菜单按钮时,它会在屏幕底部显示项目(不是我想要的)。但我找到了解决办法。

我首先在 XML 中创建了我的菜单:

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item 
        android:id="@+id/spinner_menu_item"
        android:showAsAction="always" 
        android:actionLayout="@layout/spinner" />
    </menu>

"@layout/spinner"

    <?xml version="1.0" encoding="utf-8"?>
    <com.actionbarsherlock.internal.widget.IcsSpinner xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/spinner_menu"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"  
    />

然后在 onCreateOptionsMenu 中:

    getSupportMenuInflater().inflate(R.menu.basic_menu, menu);
    MenuItem item = menu.findItem(R.id.spinner_menu_item);
    spinnerMenu = (IcsSpinner)item.getActionView();
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(MyActivity.this, android.R.layout.simple_dropdown_item_1line, menuItems);
    spinnerMenu.setAdapter(adapter);
    spinnerMenu.setOnItemSelectedListener(new IcsAdapterView.OnItemSelectedListener() {}

最后我覆盖了菜单按钮,如下所示:

    @Override
public boolean onKeyDown(int keyCode, KeyEvent event){
    if (keyCode == KeyEvent.KEYCODE_MENU){
        spinnerMenu.performClick();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

唯一不会做的是显示图标而不是文字。但是已经成功了一半!我希望这会帮助面临类似问题的人。

于 2012-12-31T23:41:06.660 回答
1

如果我理解您想要创建一个弹出菜单并在用户单击某个硬件按钮上的图标时显示它们。

好吧,这里是弹出菜单的一个很好的解释,如果你想获得一些设备密钥试试这个:

public boolean onKeyDown(int keyCode, KeyEvent event) {
    switch (keyCode) {
    case KeyEvent.KEYCODE_DPAD_CENTER:
        Toast.makeText(this, "The Center key was pressed",
                Toast.LENGTH_SHORT).show();
        return true;

    case KeyEvent.KEYCODE_DPAD_RIGHT:
        Toast.makeText(this, "The Right key was pressed",
                Toast.LENGTH_SHORT).show();
        return true;

    case KeyEvent.KEYCODE_DPAD_LEFT:
        Toast.makeText(this, "The Left key was pressed", Toast.LENGTH_SHORT)
                .show();
        return true;

    case KeyEvent.KEYCODE_BACK:
        Toast.makeText(this, "The Back key was pressed", Toast.LENGTH_SHORT)
                .show();

        //---this event has been handled---
        return true;
    }

    //---this event has not been handled---
    return false;
}

我希望这能帮到您。

于 2012-12-31T23:34:55.750 回答