【问题标题】:Custom drop-down from action item (actionbarsherlock)操作项的自定义下拉菜单 (actionbarsherlock)
【发布时间】:2012-08-31 22:37:52
【问题描述】:

我需要一个附加到操作项的自定义下拉菜单。我设法为主页图标做同样的事情,但它似乎与其他操作项完全不同。

我知道这个问题和答案:How to add a Dropdown item on the action bar 我的问题是我想完全自定义它(我使用自定义字体,也需要图标),所以我想子菜单是不够的。并且将自定义 Spinner 附加为 actionLayout 看起来不像下拉菜单。

主页图标如下所示:

    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
    ArrayList<NavItem> data = new ArrayList<NavItem>();
    data.add(...);
    data.add(...);
    ActionBarNavAdapter adapter = new ActionBarNavAdapter(...);
    actionBar.setListNavigationCallbacks(adapter, new OnNavigationListener() {...});

而且我可以在不牺牲“下拉”功能的情况下添加自己的设计。 如何处理其他操作项?

编辑: 我知道使用NAVIGATION_MODE_LIST 的活动使用Spinner(ListNavigationCallbacks 使用SpinnerAdapter),但它看起来更好,我不知道从哪里获得所有这些样式(如果只是那样的话)让它看起来像那样。我的意思是:

-> NAVIGATION_MODE_LIST 的外观:它包裹了列表,附加在主页图标下。 不好 -> 自定义SpinneractionLayout 的外观如何:它与屏幕宽度相匹配,带有一些额外的深色背景,替换了操作项图标(这很容易更改),最重要的是,使屏幕的其余部分变暗。它看起来很像带有自定义列表的 AlertDialog,而不是下拉菜单。

代码:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    MenuItem sortItem = menu.findItem(R.id.sort);
    Spinner spinner = new Spinner(this);

    //this is the same adapter because I didn't want to spend time creating a new one
    //ActionBarNavAdapter extends SpinnerAdapter of course
    ArrayList<NavItem> data = new ArrayList<NavItem>();
    data.add(...);
    data.add(...);
    ActionBarNavAdapter adapter = new ActionBarNavAdapter(...);
    spinner.setAdapter(adapter);
    sortItem.setActionView(spinner);
    return true;
}

【问题讨论】:

  • 考虑到您认为的“下拉”SpinnerSpinner 看起来就像Spinner。您可以通过在层次结构视图中使用NAVIGATION_MODE_LIST 查看活动来判断这一点。也许您可能会考虑编辑您的问题以提供给您不喜欢的结果的源代码。
  • 感谢您的评论。我用代码更新了我的问题,并解释了我不喜欢 Spinner 的地方。

标签: android android-actionbar actionbarsherlock


【解决方案1】:

尝试替换:

Spinner spinner = new Spinner(this);

与:

Spinner spinner = new Spinner(getActionBar().getThemedContext());

这将使用Context 主题来匹配操作栏,应该会有所帮助。

【讨论】:

  • 遗憾的是没有任何改变。我使用了getSupportActionBar(),因为它是 ActionBarSherlock 库。
  • @MichałK:对于ActionBarSherlock,AFAIK,Jake 使用的是com.actionbarsherlock.internal.widget.IcsSpinnercom.actionbarsherlock.internal 包中的其他东西。这不是 ActionBarSherlock 公共 API 的一部分。您需要克隆该代码和任何必要的资源(以防他以不适合您的方式更改他的实现)并安排在需要的地方使用。 “在需要的地方”肯定会包括 API 级别 10 及以下,也可能包括 11-13。如果您尝试在 ICS/JB 上运行我的建议,我认为它可能会像宣传的那样起作用。
  • 呃,看起来有很多工作要做......也许使用自定义 ActionProvider 会更容易?类似 ShareActionProvider 的东西。我只是不知道从哪里开始(无论如何这是个好主意)
  • @MichałK:ActionBarSherlock 的后向端口为 ShareActionProvider。虽然ShareActionProvider 与列出基于Intent 的一系列活动的概念非常相关,但您可以克隆他的实现并以其他方式填充您的实现。快速浏览at his code 表明您需要的一切都在公共 API 中(没有 internal 引用)。
  • 我要试试这种方法。顺便说一句,为了这么简单的事情要做很多工作......感谢您的帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-15
  • 1970-01-01
  • 2020-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多