2013-10-09 9 views
11

Mir ist klar, dass ich mit Stilen und Themen wahrscheinlich etwas grundsätzlich falsch mache, aber ich bin immer noch ein bisschen ein Android-Neuling, bitte entschuldige meine Unwissenheit. Ich versuche, den Stil meines MediaRouteButton von der Standardfarbe dunkel in hell zu ändern, da ich eine helle ActionBar habe. Mein MediaRouteButton ist in der ActionBar wie folgt umgesetzt:Wie ändere ich den Stil des MediaRouteButton in der ActionBar?

<item 
    android:id="@+id/menu_item_cast" 
    android:actionProviderClass="android.support.v7.app.MediaRouteActionProvider" 
    android:actionViewClass="android.support.v7.app.MediaRouteButton" 
    android:showAsAction="always" 
    android:actionButtonStyle="@android:style/Theme.MediaRouter.Light"/> 

aber das gibt mir:

android/res/menu/main.xml: 24: Fehler: Fehler: Keine Ressource gefunden, das die angegebenen name (at 'actionButtonStyle' mit dem Wert '@android: style/Theme.MediaRouter.Light').

Antwort

7

Wenn Sie nicht die Farbe des Symbols ändern mögen, würde Rahmen die richtigen (dunkel oder hell), basierend auf dem Thema Ihrer ActionBar, so für eine ActionBar mit hellem Hintergrund, wählen wird es Wählen Sie ein dunkleres Symbol und umgekehrt; Hier ist eine Beispielanwendung mit zwei verschiedenen Themen, Theme.AppCompat.Light und Theme.AppCompat, bzw. (alles andere ist identisch):

This is with Theme.AppCompat.Light theme

This is with Theme.AppCompat

Wie Sie sehen können, die geeignete wird automatisch ausgewählt. Wenn Sie eine andere Farbe auf der Grundlage Ihrer Branding-Anforderungen verwenden möchten, wäre der einfachste Weg, die folgenden Bilder zu einem Projekt (mit den üblichen Auflösungen unter MDPI, hdpi, ..) hinzuzufügen:

  • mr_ic_media_route_disabled_holo_dark.png
  • mr_ic_media_route_off_holo_dark.png
  • mr_ic_media_route_on_0_holo_dark.png
  • mr_ic_media_route_on_1_holo_dark.png
  • mr_ic_media_route_on_2_holo_dark.png

(Wenn Sie ein Light Actionbar Theme verwenden, ersetzen Sie "Dark" durch "Light"). Werfen Sie einen Blick auf die Assets unter https://developers.google.com/cast/docs/downloads (Abschnitt Cast Icons), um ein Gefühl dafür zu bekommen, was diese Bilder sind und bauen Sie Ihre eigenen basierend auf diesen.

+0

Das Framework scheint nicht die richtigen Symbole zu wählen, wenn Sie eine solide Aktionsleiste und' android: actionBarWidgetTheme' mit einem Elternteil von 'Theme.Base.AppCompat.Light.DarkActionBar' verwenden (a dunkle Actionbar, aber das CC Icon erscheint auch dunkel). Siehe [diese Frage] (http://stackoverflow.com/questions/24688598/styling-chromecast-mediaroute-button) –

+0

Ich habe diese Bilder hinzugefügt, aber es ändert die Farbe. –

7

Ich beendete die Dekompilierung android-support-v7-mediarouter.jar, um zu sehen, was los war. Mit dem verfügbaren Code konnte ich MediaRouteButton erweitern und das private Drawable durch Reflection Hacking setzen. Es muss einen besseren Weg geben, oder?

public class CustomMediaRouteButton extends MediaRouteButton { 

    private static final String TAG = "CustomMediaRouteButton"; 

    public CustomMediaRouteButton(Context context){ 
     this(context, null); 
    } 

    public CustomMediaRouteButton(Context context, AttributeSet attrs) { 
     this(context, attrs, R.attr.mediaRouteButtonStyle); 
    } 

    public CustomMediaRouteButton(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     Drawable d = getResources().getDrawable(R.drawable.mr_ic_media_route_holo_light); 
     setRemoteIndicatorDrawable(d); 
    } 

    private void setRemoteIndicatorDrawable(Drawable d) { 
     try { 
      Field field = MediaRouteButton.class.getDeclaredField("mRemoteIndicator"); 
      field.setAccessible(true); 
      Drawable remoteIndicator = (Drawable)field.get(this); 
      if (remoteIndicator != null) { 
       remoteIndicator.setCallback(null); 
       unscheduleDrawable(remoteIndicator); 
      } 
      field.set(this, d); 
      if (d != null) { 
       d.setCallback(this); 
       d.setState(getDrawableState()); 
       d.setVisible(getVisibility() == 0, false); 
      } 

     } catch (Exception e) { 
      Log.e(TAG, "problem changing drawable:" + e.getMessage()); 
     } 
     refreshDrawableState(); 
    } 
} 
+0

Es muss einen besseren Weg geben ... Haben Sie es geschafft, einen besseren Weg zu finden, oder ist das so, wie Sie es noch benutzen? – clu

+1

Nein. Ich benutze das immer noch. Vielleicht wird es einen besseren Weg geben, wenn Google die offizielle API veröffentlicht. – ActiveApathy

+0

Danke für die Hilfe trotzdem! – clu

0

Sie sollten in der Lage sein, den Stil zu ändern, indem Sie den Stil auf Ihre Aktivität anwenden, z. in AndroidManifest.xml. Wenn Sie das Zeichen ändern möchten, ist es mir gelungen, mr_ic_media_route_holo_light in mein Projekt einzufügen. Fügen Sie es einfach zum Drawables-Ordner hinzu und passen Sie es nach Bedarf an. Beispiel: https://github.com/android/platform_frameworks_support/blob/master/v7/mediarouter/res/drawable/mr_ic_media_route_holo_light.xml

1

Ich habe eine Möglichkeit gefunden, die Farbe von MediaRouteButton nach Code zu ändern, und es ist einfach zu machen, ohne den vorhandenen Code zu berühren.

Der MediaRouteButton wird sich dem Thema des von Ihnen übergebenen Kontexts anpassen. Sie können einen ContextThemeWrapper erstellen, um den Kontext zu umbrechen und ihn dann an MediaRouteActionProvider zu übergeben.

Es folgt ein Beispiel:

MenuItem item = menu.add(Menu.NONE, R.id.menu_cast, Menu.NONE, "Cast"); 
    MenuItemCompat.setActionProvider(item, new MediaRouteActionProvider(new ContextThemeWrapper(this, R.style.AppTheme))); 
    item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); 

Hier die R.style.AppTheme ist ein Thema, das von Theme.AppCompat erstreckt, ist es ein dunkles Thema, so dass die Guss Taste immer in Light-Version zeigen. Sie können auch ein helles Thema übergeben, um den Cast-Button in der dunklen Version zu verwenden. Sie können es auch dynamisch ändern, das Optionsmenü einfach ungültig machen, es sollte den Aktionsanbieter mit dem neuen Thema neu erstellen.

Ich verwende Support-Bibliothek 23.1.1 und habe auf diese Weise kein Problem gefunden.

1

Wenn Sie die verwendeten Symbole (nicht nur den Stil) ändern möchten, müssen Sie sie genau so benennen, wie sie here heißen. Zum Beispiel müssen Sie für das Lightshema eine Reihe von Symbolen für jede Auflösung mit Namen haben: ic_cast_on_light.png, ic_cast_on_0_light.png, ic_cast_on_1_light.png, ic_cast_on_2_light.png, ic_cast_disabled_light.png, ic_cast_off_light.png.

2

Sie können es jetzt leicht mit Ihrem benutzerdefinierten Zeichensatz ändern. Rufen Sie einfach diese Methode auf Ihrem Cast-Button.

mediaRouteButton = (MediaRouteButton) findViewById(R.id.media_route_button); 
mediaRouteButton.setRemoteIndicatorDrawable(yourDrawable); 
Verwandte Themen