1

我正在创建一个与 Froyo 向上兼容的通用应用程序,因此我使用了出色的ActionBarSherlock。我希望从 ActionBar 中的 Action Items 创建子菜单下拉菜单,其中包括行中的图标和文本。有一些线程会提出类似的问题,但我无法尝试实现它们。我已经尝试过 Spinners,但我需要 API 8 兼容性,所以我在 Sherlock 库中尝试了 IcsSpinner,但 Jake 建议其他人不要依赖它,以防库更改。我尝试了一个自定义 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 手机上崩溃。

我看过的其他线程:

如何在 Honeycomb ActionBar 中创建自定义 Pulldown?

如何在操作栏上添加下拉项

操作项的自定义下拉列表 (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);            
    }
4

1 回答 1

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

}
于 2012-09-21T13:57:20.227 回答