para - manual programacion android español pdf
Vista personalizada para el elemento del menú (2)
Bueno, entonces resultó ser más simple que eso.
En la actividad de dibujo
@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;
}
en menu.xml
<item
android:id="@+id/menu_pick_color"
android:title="@string/pick_color"
yourapp:showAsAction="always"/>
Eso es todo.
Necesito tener un elemento de menú dinámico, un círculo de color definido por el usuario, como este:
Al tocar este elemento del menú se abrirá un selector de color.
Ahora, tengo una muestra de ColorPickerIcon que extiende la vista
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;
}
}
y 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"/>
Pero no funciona de esta manera, ni puedo instanciar la clase ni se procesa. ¿Hay alguna forma de usar una clase personalizada y una vista dinámica personalizada como elemento de menú?
Lo que debe hacer es crear un archivo de diseño con la vista que desea para el elemento, cuando declare el elemento en el menú, asigne el diseño así:
<item
android:id="@+id/menu_pick_color"
android:title="@string/pick_color"
app:showAsAction="always"
app:actionLayout="@layout/my_custom_item"/>
¡Y eso es!
EDITAR:
Para acceder al elemento personalizado y modificar su color en tiempo de ejecución, puede hacer esto.
En su actividad (o fragmento) anule el onPrepareOptionsMenu
(suponiendo que ya ha inflado su menú con ''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;
}