web-dev-qa-db-fra.com

Vue personnalisée pour l'élément de menu

J'ai besoin d'avoir un élément de menu dynamique, un cercle de couleurs définies par l'utilisateur, comme ceci:

enter image description here

toucher cet élément de menu ouvrira un sélecteur de couleur.

Maintenant, j'ai un exemple ColorPickerIcon qui étend la vue

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;

}

}

et 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"/>

Mais cela ne fonctionne pas de cette façon, je ne peux pas non plus instancier la classe ni la rendre. Existe-t-il un moyen d'utiliser une classe personnalisée et une vue dynamique personnalisée comme élément de menu?

19
Roman

D'accord, cela s'est avéré plus simple que cela.

Dans le DrawingActivity

@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;
}

dans menu.xml

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

enter image description here

C'est tout.

13
Roman

Ce que vous devez faire est de créer un fichier de mise en page avec la vue que vous souhaitez pour l'élément, lorsque vous déclarez l'élément dans le menu, affectez la mise en page comme suit:

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

Et c'est tout!

MODIFIER:

Pour accéder à l'élément personnalisé et modifier sa couleur au moment de l'exécution, vous pouvez le faire.

Dans votre activité (ou fragment), remplacez le onPrepareOptionsMenu (en supposant que vous avez déjà gonflé votre menu avec '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;
}
54
Carlos J