2013-10-09 2 views
11

Я понимаю, что я, вероятно, делаю что-то принципиально неправильное со стилями и темами, но я все еще немного новичок в Android, поэтому, пожалуйста, извините мое невежество. Я пытаюсь изменить стиль моего MediaRouteButton от стандартного темного до света, так как у меня есть легкий ActionBar. Мой MediaRouteButton осуществляется в ActionBar следующим образом:Как изменить стиль MediaRouteButton в 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"/> 

Однако, это дает мне:

андроида/RES/меню/main.xml: 24: ошибка: Ошибка: Нет ресурсов не найдено, что соответствует данному name (at 'actionButtonStyle' со значением '@android: style/Theme.MediaRouter.Light').

ответ

7

Если вы не хотите, чтобы изменить цвет значка, рамки будут выбрать правильную (темную или светлый), основанные на тему вашего ActionBar, поэтому для ActionBar с светлым фоном, это будет выберите более темный значок и наоборот; вот пример приложения с двумя различными темами, 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 (раздел «Иконописи»), чтобы понять, что представляют собой эти изображения, и создать их на основе этих.

+0

В настоящее время фреймворк не подходит к правильным значкам, если вы используете сплошную панель действий и' android: actionBarWidgetTheme' с родителем 'Theme.Base.AppCompat.Light.DarkActionBar' (a темный экран действия, но значок CC также отображается темным). См. [Этот вопрос] (http://stackoverflow.com/questions/24688598/styling-chromecast-mediaroute-button) –

+0

Я добавил эти изображения, но он меняет цвет. –

7

Я закончил декомпиляцию android-support-v7-mediarouter.jar, чтобы посмотреть, что происходит. Имея доступный код, я смог расширить MediaRouteButton и установить приватный сквозной хакерский взлом. Должен быть правильный путь?

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

Nope. Я все еще использую это. Возможно, будет лучший способ, когда Google выпустит официальный API. – ActiveApathy

+0

Спасибо за помощь в любом случае! – clu

0

Вы должны иметь возможность изменить стиль, применяя стиль к своей деятельности, например. в AndroidManifest.xml. Если вы хотите изменить drawable, мне удалось добавить mr_ic_media_route_holo_light в мой проект. Просто добавьте его в папку drawables и настройте его по мере необходимости. Пример: https://github.com/android/platform_frameworks_support/blob/master/v7/mediarouter/res/drawable/mr_ic_media_route_holo_light.xml

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