2013-10-09 99 views
11

我意識到我可能做了一些根本性的風格和主題錯誤,但我仍然是一個Android新手,所以請原諒我的無知。我試圖將我的MediaRouteButton的樣式從默認的黑暗更改爲明亮,因爲我有一個輕量級的ActionBar。我MediaRouteButton在動作條實施如下:如何更改ActionBar中MediaRouteButton的樣式?

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

然而,這給了我:

的Android/RES /菜單/ main.xml中:24:錯誤:錯誤:沒有資源發現匹配給定名稱(在'actionButtonStyle'值'@android:style/Theme.MediaRouter.Light')。

回答

7

如果你不想改變圖標的​​顏色,框架將選擇合適的一個基於你的動作條的主題(深色或淺色),因此對於光的背景的動作條,它會選擇一個較暗的圖標,反之亦然;這裏有兩個不同的主題,分別Theme.AppCompat.Light和Theme.AppCompat,一個示例應用程序(一切是相同的):

This is with Theme.AppCompat.Light theme

This is with Theme.AppCompat

正如你所看到的,一個合適的被自動選擇。如果你想使用基於你的品牌要求不同的顏色,最簡單的是將以下圖片添加到您的項目(以下MDPI平常決議,華電國際,..):

  • 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

(如果您使用的是輕型操作欄主題,請將「黑色」替換爲「燈光」)。看看https://developers.google.com/cast/docs/downloads(部分Cast Icons)的資產,以便了解這些圖像是什麼,並根據這些圖像構建自己的圖像。

+0

如果你正在使用一個可靠的操作欄和'':Theme.Base.AppCompat.Light.DarkActionBar'的一個父'android:actionBarWidgetTheme',那麼該框架似乎不會選擇正確的圖標黑暗的動作條,但CC圖標也顯示黑暗)。看到[這個問題](http://stackoverflow.com/questions/24688598/styling-chromecast-mediaroute-button) –

+0

我添加了這些圖像,但它確實改變了顏色。 –

7

我結束了反編譯android-support-v7-mediarouter.jar,看看發生了什麼。通過使用代碼,我可以擴展MediaRouteButton並通過反射黑客設置私有Drawable。必須有更好的方法嗎?

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

必須有一個更好的方法......你有沒有設法找到一個更好的方法,或者這是你仍然使用的方式? – clu

+1

沒有。我仍然在使用它。也許Google在發佈官方API時會有更好的方式。 – ActiveApathy

+0

感謝您的幫助! – clu

1

我找到了一種方法來通過代碼更改MediaRouteButton的顏色,並且很容易完成,無需觸摸現有代碼。

MediaRouteButton將根據您傳遞的上下文主題自行設計風格。您可以創建一個ContextThemeWrapper來包裝上下文,然後將其傳遞給MediaRouteActionProvider。

下面是一個例子:

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延伸的主題,這是一個黑暗的主題所以劇組按鈕會始終顯示在輕型版本。您還可以傳入輕量級主題以使投射按鈕在黑暗版本中表現得更好。您也可以動態更改它,只需使選項菜單無效,就應該使用新主題重新創建操作提供程序。

我正在使用支持庫23.1.1,並沒有以這種方式發現任何問題。

1

如果你想改變使用的圖標(不僅僅是樣式),你需要命名爲here。例如,對於輕量級主題,您需要爲名稱中的每個分辨率設置一組圖標: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

您可以使用自定義繪圖工具輕鬆更改它。 只需在您的投射按鈕上調用此方法即可。

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