Настройка цвета заголовка приложения на экране обзора (недавние приложения)

Я добавляю в приложение некоторые стили только для Lollipop.

Я хочу изменить цвет заголовка на обзорном экране, например Gmail здесь:
введите здесь описание изображения

Я понял, что могу сделать

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

    <item name="android:colorPrimary">@color/my_favorite_color</item>

</style>

для этого, но я хотел бы указать только цвет для этого случая, как я могу сделать:

<item name="android:statusBarColor">@color/my_favorite_color<item>

Есть ли специальный атрибут для установки цвета заголовка?

Дополнительный вопрос: можно ли также изменить значок и заголовок?


person MaciejGórski    schedule 22.11.2014    source источник
comment
Это дубликат stackoverflow.com/questions/26899820/, но не может быть закрыт из-за награды.   -  person alanv    schedule 24.11.2014
comment
@alanv Аккуратно, спасибо, Алан. Я бы сказал, что это дубликат, потому что указанный вами вопрос касается изменения цвета заголовка, что кажется невозможным. В любом случае ответ там прекрасно отвечает на мой вопрос. Если бы вы могли ответить, я удалю / перенесу награду, что позволит вам проголосовать за закрытие этого вопроса.   -  person MaciejGórski    schedule 24.11.2014
comment
@MaciejGórski Просто улучшение (на мой взгляд): если вы уже знаете, какой цвет вам нужно указать, вы можете переопределить setTaskDescription(TaskDescription) и передать соответствующий экземпляр TaskDescription супервызову. Чтобы отследить источник, просмотрите TaskViewHeader. Вы должны закончить на Activity#onApplyThemeResource(....) - отсюда вызывается setTaskDescription(TaskDescription).   -  person Vikram    schedule 24.11.2014
comment
@Vikram Спасибо, что указали на onApplyThemeResource. Из кода мы можем ясно сделать вывод, что фон нельзя изменить с помощью темы приложения, как и statusBarColor, за исключением использования colorPrimary. Я не уверен, что полагаться на то, что setTaskDescription вызывается фреймворком, было бы хорошо. Не так плохо, как пытаться вызвать ActivityManagerNative.getDefault().setTaskDescription через отражение (что я только что сделал, чтобы попытаться сделать значок другого размера, но это не сработало), но я думаю, что предпочитаю более простой способ иметь вспомогательный класс совместимости с if (SDK_INT >= LOLLIPOP) .   -  person MaciejGórski    schedule 25.11.2014
comment
@MaciejGórski ...which I just did to try to make a different size of icon, but it didn't work... Вероятно, это потому, что TaskViewHeader использует значок FixedSizeImageView для значка приложения: проверьте макет xml здесь: recent_task_view_header.xml. I'm not sure relying on setTaskDescription being called by the framework would be a good thing. Почему бы и нет? Мне кажется, что setTaskDescription() вызывается по крайней мере один раз: при создании активности и установке ее темы.   -  person Vikram    schedule 26.11.2014
comment
@Vikram Да, он вызывается ровно один раз перед onCreate, но это поведение не является частью жизненного цикла, не документировано, и разработчики, впервые просматривающие код, который это делает, не смогут понять его без комментариев в теле переопределенного метода. объясняя, как это работает, или углубляясь в код Android. Самостоятельный вызов в onCreate — это простой способ заявить о назначении кода, и даже если разработчик не знал о существовании этого метода, он мог просто посмотреть javadoc. Мне нравится писать меньше кода, но больше мне нравится быть ясным с кодом, который я пишу.   -  person MaciejGórski    schedule 27.11.2014
comment
@ MaciejGórski I like writing less code, but more than that I like being clear with the code I write. :) Я не думал об этом. Я согласен - явный вызов был бы лучше.   -  person Vikram    schedule 28.11.2014
comment
Можно ли установить постоянный цвет заголовка прямо в манифесте, не добавляя в проект пользовательский файл styles.xml?   -  person Viktor Sehr    schedule 18.09.2018


Ответы (1)


Вы можете изменить это через ActivityManager.TaskDescription:

https://developer.android.com/reference/android/app/ActivityManager.TaskDescription.html< /а>

Из контекста действия вызовите:

TaskDescription taskDescription = new TaskDescription(label, icon, colorPrimary);
((Activity)this).setTaskDescription(taskDescription);
person Tim Malseed    schedule 25.11.2014
comment
Чтобы уточнить: * Метка — текст в заголовке карты * Значок — левый растровый значок (обычно значок, который хорошо смотрится на цвете «colorPrimary» * colorPrimary — цвет заголовка карты (обычно такой же, как цвет панели инструментов, но не обязательно) Это решение сработало для меня, +1 :) - person milosmns; 15.04.2015
comment
Прекрасно работает. В зависимости от minSdkVersion может потребоваться завернуть в if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { ... } - person Jonik; 29.04.2015
comment
Работает хорошо, как только вы поймете, что это не будет работать в onCreate(). Поместите этот код в onResume() и все готово. - person user149408; 09.11.2015
comment
Есть ли возможность сделать это для SDK 19? - person cherry-wave; 30.05.2016
comment
Круто, в моем случае мне пришлось поместить его в метод onStart(), чтобы он заработал. - person Dariush Malek; 15.04.2017