无法显示子菜单的自定义ActionProvider [英] Can't display sub-menu for custom ActionProvider

查看:161
本文介绍了无法显示子菜单的自定义ActionProvider的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一个自定义的 ActionProvider ,我想用它来显示一个子菜单进行排序,类似视觉上 ShareActionProvider 。动作视图显示为预期,但点击图标不显示的子菜单,或者显示在所有任何视觉反馈(pressed状态)。我使用的是为了向后兼容操作栏上的支持V7库。是否有一个执行我缺少显示菜单?

ActionProvider:

 公共类SortActionProvider扩展ActionProvider实现OnMenuItemClickListener {

    私人语境mContext;

    公共SortActionProvider(上下文的背景下){
        超(上下文);
        mContext =背景;
    }

    @覆盖
    公共查看onCreateActionView(){
        ImageView的ImageView的=新ImageView的(mContext);
        imageView.setImageResource(R.drawable.ic_action_sort_by_size);

        返回ImageView的;
    }

    @覆盖
    公共布尔hasSubMenu(){
        返回true;
    }

    @覆盖
    公共无效于prepareSubMenu(子菜单的子菜单){
        subMenu.clear();

        subMenu.add(按名称排序)setOnMenuItemClickListener(本)。
        subMenu.add(按类型排序)setOnMenuItemClickListener(本)。
    }

    @覆盖
    公共布尔onMenuItemClick(菜单项项){
        Toast.makeText(mContext,我被点击!,Toast.LENGTH_SHORT).show();
        返回true;
    }
}
 

菜单:

 <菜单的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    的xmlns:支持=htt​​p://schemas.android.com/apk/res-auto>

    <项目
        机器人:ID =@ + ID / menu_sort
        机器人:actionProviderClass =com.myapp.provider.SortActionProvider
        机器人:showAsAction =总是
        机器人:标题=@字符串/排序
        支持:actionProviderClass =com.myapp.provider.SortActionProvider
        支持:showAsAction =总是/>

< /菜单>
 

解决方案

不幸的是,在prepareSubMenu()时,才会调用时 onCreateActionView ()返回null。您的解决方案(附加的PopupMenu 的ImageView )的工作,但因为你的 ImageView的正在显示一个图标,你可以考虑只设置菜单中的XML图标并摆脱的ImageView 的:

 <项目机器人:ID =@ + ID / menu_sort
      机器人:图标=@可绘制/ ic_action_sort_by_size
      机器人:标题=@字符串/排序
      支持:actionProviderClass =com.myapp.provider.SortActionProvider
      支持:showAsAction =总是/>
 

然后:

  @覆盖
公共查看onCreateActionView(){
    返回null;
}
 

这也应该解决的问题与接触状态没有视觉反馈 - 问题是,你的ImageView的未配置为触摸状态做任何事情

I've created a custom ActionProvider that I want to use to show a sub-menu for sorting, similar visually to ShareActionProvider. The action view displays as expected, but clicking on the icon doesn't display the sub-menu or show any visual feedback (pressed state) at all. I'm using the support v7 library for backward compatibility action bar. Is there an implementation I am missing to display the menu?

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:

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

解决方案

Unfortunately, onPrepareSubMenu() is only called when onCreateActionView() returns null. Your solution (attaching a PopupMenu to the ImageView) will work, but since your ImageView is displaying an icon, you might consider just setting the icon in the menu XML and getting rid of the 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" />

and then:

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

This should also solve the problem with no visual feedback for touch states - the problem being that your ImageView is not configured to do anything with touch states.

这篇关于无法显示子菜单的自定义ActionProvider的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆