无法显示子菜单的自定义ActionProvider [英] Can't display sub-menu for custom 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:机器人=http://schemas.android.com/apk/res/android
的xmlns:支持=http://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屋!