我创建了一个自定义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>
答案 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;
}