无法显示自定义ActionProvider的子菜单

时间:2013-10-17 23:36:09

标签: android android-actionbar

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

ActionProvider:

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>

2 个答案:

答案 0 :(得分:4)

不幸的是,onPrepareSubMenu()仅在onCreateActionView()返回null时被调用。您的解决方案(将PopupMenu附加到ImageView)将起作用,但由于您的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没有配置为对触摸状态做任何事情。

答案 1 :(得分:2)

单击操作视图时,ActionProvider不显示子菜单。我实际上不确定在什么条件下显示子菜单。我必须做的是将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;
}