2014-10-08 23 views
16

ho bisogno di avere dinamica voce di menu, un cerchio di colore definito dall'utente, in questo modo:vista personalizzato per voce di menu

enter image description here

toccare questa voce di menu si aprirà un selettore di colori.

Ora, ho ColorPickerIcon campione che si estende View

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; 

} 

} 

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

Ma non funziona in questo modo, nessuno dei due può Istanzia la classe e non è resa. C'è un modo per utilizzare la classe personalizzata e la visualizzazione dinamica personalizzata come voce di menu?

risposta

11

Okay, quindi si è rivelato essere più semplice di così.

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

in menu.xml

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

enter image description here

Questo è tutto.

+0

Oh mio Dio, grazie! Ho sprecato un'ora o più cercando di ottenere l'oggetto View da MenuItem per modificarne lo sfondo e il colore del testo, ma questa è una risposta davvero buona e pulita. Grazie ancora! : D – devrique

+2

Non c'è azione quando si fa clic sul selettore di colori? Come gestire il clic sul selettore di colori? Diciamo che ho un layout personalizzato per il selettore colori. Penso che risponderò a questa domanda. – cegprakash

44

Quello che dovete fare è creare un file di layout con la vista che si desidera per l'articolo, il momento di dichiarare la voce del menu, assegnare il layout in questo modo:

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

E questo è tutto !

EDIT:

per accedere all'elemento personalizzato e modificare il suo colore in fase di esecuzione si può fare questo.

Nella vostra attività (o frammento) ignorare il onPrepareOptionsMenu (Supponendo che già gonfiato il vostro menu 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; 
} 
+0

E come aggiornerei il colore in modo dinamico quindi? – Roman

+0

Ho appena modificato la mia risposta –

+0

Grazie, Carlos! Ho appena trovato una soluzione leggermente diversa, che ha funzionato per me. – Roman

Problemi correlati