我正在创建一个与Froyo向上兼容的通用应用程序,所以我正在使用辉煌的ActionBarSherlock。我希望从ActionBar中的Action Items创建子菜单下拉菜单,其中包含行中的图标和文本。有几个线程提出类似的问题,但我没有尝试实现它们。我已经尝试过Spinners但是我需要API 8兼容性,所以我在Sherlock lib中尝试了IcsSpinner但是Jake已经建议别人不要依赖它来防止lib发生变化。我尝试了一个自定义的ActionProvider来模仿ShareActionProvider,但我发现它太复杂了:
这张图片显示了我想要的内容,但我无法使用我的应用程序。我的代码如下:
public class AddDocActionProvider extends ActionProvider {
private Context mContext;
public AddDocActionProvider(Context context) {
super(context);
mContext = context;
}
@Override
public View onCreateActionView() {
LayoutInflater layoutInflater = LayoutInflater.from(mContext);
View view = layoutInflater.inflate(
R.layout.actionbar_new_doc_action_provider, null);
return view;
}
@Override
public boolean hasSubMenu() {
return true;
}
@Override
public void onPrepareSubMenu(SubMenu subMenu) {
// loop was here calling
subMenu.add(0, id, 0, "Type 1")
.setIcon(R.drawable.type_1)
.setOnMenuItemClickListener(mOnMenuItemClickListener);
// added type 2, 3, etc
}
@Override
public boolean onPerformDefaultAction() {
// This is called if the host menu item placed in the overflow menu of the
// action bar is clicked and the host activity did not handle the click.
return true;
}
我的SherlockFragmentActivity有这段代码:
@Override
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
MenuItem newDoc = menu.add(0, MENU_ADD_DOC, 0, "New Document");
newDoc.setVisible(!isPhoneShowingStorageList);
newDoc.setIcon(R.drawable.dark_content_new);
newDoc.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
mNewDocActionProvider = new AddDocActionProvider(getSupportActionBar().getThemedContext());
newDoc.setActionProvider(mNewDocActionProvider);
}
我没有看到子菜单,当操作栏无效时,它也会在froyo手机上崩溃。
我看过的其他主题:
How to create a custom Pulldown in the Honeycomb ActionBar?
How to add a Dropdown item on the action bar
Custom drop-down from action item (actionbarsherlock)
虽然这不一定是ActionBarSherlock特定的问题,坦率地说,我不敢相信这个简单的东西应该在标准的Action Bar中实现这么复杂。任何帮助将不胜感激。
更新: 使用XML而不是代码为我添加了图标:
<item
android:id="@+id/menu_new_doc"
android:icon="@drawable/dark_content_new"
android:showAsAction="always"
android:title="New Document">
<menu>
<item
android:id="@+id/word2010"
android:icon="@drawable/doc"
android:title="Word 2010"/>
<item
android:id="@+id/excel2010"
android:icon="@drawable/excel"
android:title="Excel 2010"/>
</menu>
</item>
因此,为了动态获得子菜单,我必须这样做:
MenuItem newDoc = menu.findItem(R.id.menu_new_doc);
SubMenu subMenu = newDoc.getSubMenu();
subMenu.clear();
for (/* loop */) {
MenuItem subMenuItem = subMenu.add(0, hash, 0, fileType.GetDescription());
subMenuItem.setIcon(R.drawable.doc);
}
答案 0 :(得分:3)
我认为您应该将图标设置为新添加的项目到子菜单。示例:
public boolean onCreateOptionsMenu(Menu menu) {
SubMenu subMenu = menu.addSubMenu("Add");
subMenu.add("Add Subitem 1").setIcon(R.drawable.ic_action_add1);
subMenu.add("Add Subitem 2").setIcon(R.drawable.ic_action_add2);
MenuItem subMenu1Item = subMenu.getItem();
subMenu1Item.setIcon(R.drawable.ic_action_add);
subMenu1Item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
return super.onCreateOptionsMenu(menu);
}