2014-10-08 15 views
16

muszę mieć dynamiczne pozycja menu, krąg zdefiniowane przez użytkownika kolor, podobnie jak to:Niestandardowy widok dla elementu menu

enter image description here

dotykania tego menu otworzy próbnika kolorów.

Teraz mam przykładowy ColorPickerIcon która rozciąga się widok

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; 

} 

} 

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

Ale to nie działa w ten sposób, nie może Inicjuję klasę, która nie jest renderowana. Czy istnieje sposób użycia niestandardowej klasy i niestandardowego widoku dynamicznego jako elementu menu?

Odpowiedz

11

porządku, więc okazało się to być prostsze niż to.

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

w menu.xml

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

enter image description here

To wszystko.

+0

O mój boże, dziękuję! Zmarnowałem jak godzinę lub dłużej próbując pobrać obiekt View z MenuItem, aby zmodyfikować jego tło i kolor tekstu, ale jest to naprawdę dobra i czysta odpowiedź. Dzięki jeszcze raz! : D – devrique

+2

Nie ma akcji po kliknięciu na selektorze kolorów? Jak obsługiwać kliknięcie w selektorze kolorów? Załóżmy, że mam niestandardowy układ do selektora kolorów. Myślę, że to odpowie na to pytanie. – cegprakash

44

Co trzeba zrobić, to stworzyć plik układu z poglądem, że chcesz dla elementu, gdy zadeklarować pozycję w menu, należy przypisać układ takiego:

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

I to wszystko !

EDIT:

Aby uzyskać dostęp do elementu niestandardowego i zmienić jej kolor na starcie można to zrobić.

W swojej działalności (lub fragmentu) przesłonić onPrepareOptionsMenu (zakładając, że już napompowane swoje menu z „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

A jak miałbym dynamicznie aktualizować kolor? – Roman

+0

Właśnie edytowałem moją odpowiedź –

+0

Dzięki, Carlos! Właśnie znalazłem nieco inne rozwiązanie, które zadziałało dla mnie. – Roman

Powiązane problemy