2014-10-08 4 views
16

muss ich dynamische Menüpunkt haben, einen Kreis von benutzerdefinierten Farbe, wie folgt aus:Benutzerdefinierte Ansicht für Menüpunkt

enter image description here

diesen Menüpunkt berührt wird eine Farbauswahl öffnen.

Jetzt habe ich Probe ColorPickerIcon die Ansicht

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; 

} 

} 

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

Aber es funktioniert nicht auf diese Weise erstreckt, weder kann Ich instanziiere die Klasse, noch wird sie gerendert. Gibt es eine Möglichkeit, benutzerdefinierte Klasse und benutzerdefinierte dynamische Ansicht als Menüelement zu verwenden?

Antwort

11

Okay, es erwies sich als einfacher als das.

Im 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

Das ist alles.

+0

Oh mein Gott, danke! Ich verschwendete wie eine Stunde oder mehr und versuchte, das View-Objekt aus dem MenuItem zu holen, um dessen Hintergrund und Textfarbe zu ändern, aber das ist eine wirklich gute und saubere Antwort. Danke noch einmal! : D – devrique

+2

Es gibt keine Aktion, wenn auf den Farbwähler geklickt wird? Wie gehe ich mit dem Klick auf den Farbwähler um? Nehmen wir an, ich habe ein benutzerdefiniertes Layout für die Farbauswahl. Ich denke, dass wird diese Frage beantworten. – cegprakash

44

Was Sie tun müssen, ist eine Layout-Datei mit der Ansicht erstellen, die Sie für das Einzelteil wünschen, die, wenn Sie das Element im Menü deklarieren, weisen Sie das Layout wie folgt aus:

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

Und das ist es !

EDIT:

Um das benutzerdefinierte Element zugreifen und diese ändern sie Farbe zur Laufzeit sind, dies zu tun.

In Ihrer Tätigkeit (oder Fragment) außer Kraft setzen die onPrepareOptionsMenu (Vorausgesetzt, dass Sie Ihr Menü bereits mit 'onCreateOptionsMenu' aufgeblasen)

@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

Und wie würde ich dann dynamisch Farbe aktualisieren? – Roman

+0

Ich habe gerade meine Antwort bearbeitet –

+0

Danke, Carlos! Ich habe gerade eine etwas andere Lösung gefunden, die für mich funktioniert hat. – Roman