菜单项的自定义视图

Posted

技术标签:

【中文标题】菜单项的自定义视图【英文标题】:Custom view for Menu Item 【发布时间】:2014-12-03 05:55:34 【问题描述】:

我需要动态的菜单项,一圈用户定义的颜色,像这样:

触摸此菜单项将打开一个颜色选择器。

现在,我有扩展 View 的示例 ColorPickerIcon

public class ColorPickerIcon extends View 

private Paint mPaint;
private int mColor;

private final int mRadius = 20;

public ColorPickerIcon(Context context) 
    super(context);

    mColor = Color.BLACK;
    mPaint = createPaint();


public ColorPickerIcon(Context context, AttributeSet attrs) 
    super(context, attrs);

    mColor = Color.BLACK;
    mPaint = createPaint();


@Override
protected void onDraw(Canvas canvas) 
    super.onDraw(canvas);
    canvas.drawCircle(0, 0, mRadius, mPaint);


public void setPaintColor(int color) 
    mColor = color;


private Paint createPaint() 

    Paint temp = new Paint();
    temp.setAntiAlias(true);
    temp.setStyle(Paint.Style.STROKE);
    temp.setStrokeJoin(Paint.Join.ROUND);

    temp.setStrokeWidth(6f);
    temp.setColor(mColor);

    return temp;




和 menu.xml

<item
    android:id="@+id/menu_pick_color"
    android:title="@string/pick_color"
    yourapp:showAsAction="always"
    yourapp:actionViewClass="com.example.widgets.ColorPickerIcon"/>

<item
    android:id="@+id/menu_clear"
    android:icon="@null"
    android:title="@string/clear"
    yourapp:showAsAction="always"/>

<item
    android:id="@+id/menu_save"
    android:icon="@null"
    android:title="@string/save"
    yourapp:showAsAction="always"/>

但它不能以这种方式工作,我既不能实例化该类,也不能渲染它。有没有办法使用自定义类和自定义动态视图作为菜单项?

【问题讨论】:

【参考方案1】:

您需要做的是创建一个布局文件,其中包含您想要的项目视图,当您在菜单上声明项目时,像这样分配布局:

<item
    android:id="@+id/menu_pick_color"
    android:title="@string/pick_color"
    app:showAsAction="always"
    app:actionLayout="@layout/my_custom_item"/>

就是这样!

编辑:

要访问自定义项并在运行时修改它的颜色,您可以这样做。

在您的活动(或片段)中覆盖 onPrepareOptionsMenu(假设您已经使用 'onCreateOptionsMenu' 扩充了菜单)

@Override
public boolean onPrepareOptionsMenu(Menu menu) 

    //Get a reference to your item by id
    MenuItem item = menu.findItem(R.id.menu_pick_color);

    //Here, you get access to the view of your item, in this case, the layout of the item has a FrameLayout as root view but you can change it to whatever you use
    FrameLayout rootView = (FrameLayout)item.getActionView();

    //Then you access to your control by finding it in the rootView
    YourControlClass control = (YourControlClass) rootView.findViewById(R.id.control_id);

    //And from here you can do whatever you want with your control

    return true;

【讨论】:

谢谢,卡洛斯!我刚刚找到了一个对我有用的不同解决方案。 这行得通,但是我还添加了手动连接事件,如下所示:***.com/a/26187926/996117。谢谢! 如果此代码不起作用,请尝试将“android:actionLayout”更改为“app:actionLayout”。 如果你想要 OnClickListener,去这里:***.com/questions/11627892/…【参考方案2】:

好的,结果证明比这更简单。

在绘图活动中

@Override
public boolean onCreateOptionsMenu(Menu menu) 
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_drawing, menu);

    MenuItem colorPicker = menu.findItem(R.id.menu_pick_color);

    ShapeDrawable circle = new ShapeDrawable(new OvalShape());
    circle.getPaint().setColor(Color.GREEN);
    circle.setIntrinsicHeight(120);
    circle.setIntrinsicWidth(120);
    circle.setBounds(0, 0, 120, 120);

    colorPicker.setIcon(circle);

    return true;

在 menu.xml 中

<item
    android:id="@+id/menu_pick_color"
    android:title="@string/pick_color"
    yourapp:showAsAction="always"/>

就是这样。

【讨论】:

天哪,谢谢!我浪费了一个小时或更长时间试图从 MenuItem 获取 View 对象来修改它的背景和文本颜色,但这是一个非常好的和干净的答案。再次感谢! :D 点击取色器没有任何动作?如何处理颜色选择器上的点击?假设我有一个颜色选择器的自定义布局。我想这会回答这个问题。

以上是关于菜单项的自定义视图的主要内容,如果未能解决你的问题,请参考以下文章

Tableview 上下文菜单:从行到预览视图控制器的自定义动画

从自定义列表 Xamarin 中设置所选列表视图项的背景颜色

如何更改 Android 菜单项的自定义字体?

自定义菜单作为子视图

创建类似于新的 iOS 6 按钮共享的自定义共享视图

[在运行菜单项中添加Eclipse默认菜单项