1

我创建了一个自定义ActionProvider,我想用它来显示一个用于排序的子菜单,在视觉上类似于ShareActionProvider. 操作视图按预期显示,但单击图标不会显示子菜单或显示任何视觉反馈(按下状态)。我正在使用 support v7 库来实现向后兼容操作栏。我是否缺少显示菜单的实现?

动作提供者:

public class SortActionProvider extends ActionProvider implements OnMenuItemClickListener {

    private Context mContext;

    public SortActionProvider(Context context) {
        super(context);
        mContext = context;
    }

    @Override
    public View onCreateActionView(){
        ImageView imageView = new ImageView(mContext);
        imageView.setImageResource(R.drawable.ic_action_sort_by_size);

        return imageView;
    }

    @Override
    public boolean hasSubMenu(){
        return true;
    }

    @Override
    public void onPrepareSubMenu(SubMenu subMenu){
        subMenu.clear();

        subMenu.add("Sort by name").setOnMenuItemClickListener(this);
        subMenu.add("Sort by type").setOnMenuItemClickListener(this);
    }

    @Override
    public boolean onMenuItemClick(MenuItem item){
        Toast.makeText(mContext, "I was clicked!", Toast.LENGTH_SHORT).show();
        return true;
    }
}

菜单:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:support="http://schemas.android.com/apk/res-auto" >

    <item
        android:id="@+id/menu_sort"
        android:actionProviderClass="com.myapp.provider.SortActionProvider"
        android:showAsAction="always"
        android:title="@string/sort"
        support:actionProviderClass="com.myapp.provider.SortActionProvider"
        support:showAsAction="always"/>

</menu>
4

2 回答 2

4

不幸的是,onPrepareSubMenu()仅在onCreateActionView()返回 null 时调用。您的解决方案(将 a 附加PopupMenuImageView)将起作用,但由于您ImageView正在显示一个图标,您可能会考虑在菜单 XML 中设置图标并摆脱ImageView

<item android:id="@+id/menu_sort"
      android:icon="@drawable/ic_action_sort_by_size"
      android:title="@string/sort"
      support:actionProviderClass="com.myapp.provider.SortActionProvider"
      support:showAsAction="always" />

接着:

@Override
public View onCreateActionView(){
    return null;
}

这也应该解决触摸状态没有视觉反馈的问题 - 问题是您的 ImageView 未配置为对触摸状态执行任何操作。

于 2013-10-18T17:47:03.440 回答
2

单击操作视图时,ActionProvider不显示子菜单。我实际上不确定在什么条件下显示子菜单。我所要做的就是将 a 附加PopupMenu到操作视图:

@Override
public View onCreateActionView(){
    ImageView imageView = new ImageView(mContext);
    imageView.setImageResource(R.drawable.ic_action_sort_by_size);

    final PopupMenu menu = new PopupMenu(mContext, imageView);
    menu.inflate(R.menu.sort_options_menu);
    menu.setOnMenuItemClickListener(this);

    imageView.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v){
            menu.show();
        }
    });

    return imageView;
}
于 2013-10-18T16:15:41.083 回答