【问题标题】:how to create custom drop down menu with actionbarsherlock?如何使用 actionbarsherlock 创建自定义下拉菜单?
【发布时间】:2012-12-15 21:30:43
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: java android menu android-actionbar actionbarsherlock


    【解决方案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);
    }
    

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

    【讨论】:

      【解决方案2】:

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

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

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

      希望对你有帮助。

      【讨论】:

      • 是的,这是正确的,我不久前就发现了这一点并发布了我的答案。我现在面临的唯一问题是显示图标而不是文本。谢谢!
      • 您可以制作自己的下拉样式并设置为属性Style
      猜你喜欢
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      • 2016-04-11
      • 2014-07-15
      相关资源
      最近更新 更多