studio programacion para móviles español edición desarrollo desarrollar curso aprende aplicaciones android android-actionbar menuitem

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