2013-10-09 16 views
11

Ben muhtemelen tarzları ve temaları temelden yanlış bir şey yapıyorum farkında ama yani benim cehalet mazeret lütfen hala bir Android newbie sayılırım. Işığında ActionBar'ım olduğu için MediaRouteButton'umun stilini varsayılan karanlıktan ışığa değiştirmeye çalışıyorum. aşağıdaki gibi Benim MediaRouteButton İşlem Çubuğu uygulanır:ActionBar'daki MediaRouteButton stilini nasıl değiştiririm?

android/res/menü/main.xml:: 24: Hata: Hata: Hiçbir kaynak bulduğunu verilen maçları Ancak

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

, bu bana verir adı ('actionButtonStyle' değerinde @android: style/Theme.MediaRouter.Light ').

cevap

7

, çerçeve böylece ışık arka plan ile bir İşlem Çubuğu için, bu olacak, senin İşlem Çubuğu temasına dayalı (koyu veya açık) doğru bir seçim olacaktır daha koyu bir simge seçin ve tam tersini yapın; Burada iki farklı temalar sırasıyla Theme.AppCompat.Light ve Theme.AppCompat bulunan örnek uygulaması (her şey aynıdır):

This is with Theme.AppCompat.Light theme

This is with Theme.AppCompat

uygun bir, görebileceğiniz gibi otomatik olarak seçilir.

  • mr_ic_media_route_disabled_holo_dark.png: Eğer marka gereksinimlerine göre farklı bir renk kullanmak istiyorsanız, en kolay (MDPI altında zamanki çözünürlüklerde, hdpi, ..) ile projenize aşağıdaki resim eklemek olacaktır mr_ic_media_route_on_2_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

(bir ışık İşlem Çubuğu tema kullanıyorsanız, ile "karanlık" "ışık" değiştirin). Bu resimlerin ne olduğuna dair bir fikir edinmek ve bunlara dayanarak kendi yapınızı oluşturmak için https://developers.google.com/cast/docs/downloads (Yayın Simgeleri) bölümündeki varlıklara göz atın.

+0

Çerçeve teması, katı bir eylem çubuğu kullanıyorsanız ve 'android: actionBarWidgetTheme' bir tema ile 'Theme.Base.AppCompat.Light.DarkActionBar' (bir karanlık actionbar, henüz CC simgesi de karanlıkta ortaya çıkıyor). [Bu soru] bölümüne bakın (http://stackoverflow.com/questions/24688598/styling-chromecast-mediaroute-button) –

+0

Bu görüntüleri ekledim ancak renk değiştiriyor. –

7

Ben neler olduğunu görmek için Dekompilasyon android-destek-v7-mediarouter.jar sona erdi. Mevcut kod ile MediaRouteButton'u genişletebildim ve yansıtma korsanlığı yoluyla özel Drawable'ı ayarlayabildim. Daha iyi bir yol olmalı? Eğer simgenin rengini değiştirmek istemiyorsanız

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

Daha iyi bir yol olmalı ... Daha iyi bir yol bulmayı başardınız mı, yoksa bu şekilde mi kullanıyorsunuz? – clu

+1

Hayır. Bunu hala kullanıyorum. Belki de Google resmi API'yi yayınladığında daha iyi bir yol olacaktır. – ActiveApathy

+0

Yine de yardımın için teşekkürler! – clu

1

ben koduna göre MediaRouteButton sizin rengini değiştirmek için bir yol bulduk ve yapılması kolaydır, mevcut kodu dokunmak gerek.

MediaRouteButton geçtiğin bağlamın tema aşağıdaki kendisini stil olacaktır. Bağlamı sarmak ve MediaRouteActionProvider'a iletmek için bir ContextThemeWrapper oluşturabilirsiniz.

ardından bir örnektir: Burada

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

R.style.AppTheme Theme.AppCompat uzanan bir tema, her zaman ışık sürümünde gösterecektir yayınlama düğmesine böylece karanlık bir tema. Karanlık versiyonda cast butonu yapmak için ışık temasını da geçebilirsiniz. Ayrıca dinamik olarak değiştirebilir, sadece seçenek menüsünü geçersiz kılabilir, yeni temayı kullanarak işlem sağlayıcısını yeniden oluşturmalıdır.

Destek kitaplığı 23.1.1 kullanıyorum ve bu şekilde bir sorun bulamadınız.

1

Kullanılan simgeleri (yalnızca stilde değil) değiştirmek isterseniz, bunlara, here adlı tam olarak aynı şekilde ad vermeniz gerekir. Örneğin, ışık teması için, her bir çözünürlük için isimlerle bir simgeler kümesi gerekir: 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

Artık kolayca çekilebilir özelliğinizle değiştirebilirsiniz. Sadece bu yöntemi yayınla düğmenizde arayın.

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