J'ai besoin d'avoir un élément de menu dynamique, un cercle de couleurs définies par l'utilisateur, comme ceci:
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?
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"/>
C'est tout.
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;
}