Установить цвет фона заголовка

106

В моем приложении для Android я хочу, чтобы стандартная / базовая строка заголовка меняла цвет.

setTitleColor(int color)Есть ли способ изменить цвет фона полосы, чтобы изменить цвет текста ?

Thizzer
источник
Я думаю, нет необходимости использовать настраиваемый заголовок для изменения цвета фона в строке заголовка. проверьте этот пост
Deepthi Jabili
Я бы посмотрел на ответ Эдвинфада вместо устаревшего принятого.
zgc7009

Ответы:

186

Этот поток поможет вам создать собственную строку заголовка в XML-файле и использовать ее в своей деятельности.

редактировать

Вот краткое изложение содержания ссылки выше - это просто для установки цвета текста и фона строки заголовка - без изменения размера, без кнопок, просто самый простой образец

res / layout / mytitle.xml - это представление, которое будет представлять строку заголовка

<?xml version="1.0" encoding="utf-8"?>
<TextView
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/myTitle"
  android:text="This is my new title"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:textColor="@color/titletextcolor"
   />

res / values ​​/ themes.xml - мы хотим сохранить тему Android по умолчанию, и нам просто нужно изменить цвет фона заголовка. Итак, мы создаем тему, наследующую тему по умолчанию, и устанавливаем стиль фона в наш собственный стиль.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="customTheme" parent="android:Theme"> 
        <item name="android:windowTitleBackgroundStyle">@style/WindowTitleBackground</item>   
    </style> 
</resources>

res / values ​​/ styles.xml - здесь мы устанавливаем тему для использования желаемого цвета для фона заголовка.

<?xml version="1.0" encoding="utf-8"?>
<resources> 
   <style name="WindowTitleBackground">     
        <item name="android:background">@color/titlebackgroundcolor</item>                   
    </style>
</resources>

res / values ​​/ colors.xml - установите здесь желаемый цвет

<?xml version="1.0" encoding="utf-8"?>
<resources>   
    <color name="titlebackgroundcolor">#3232CD</color>
    <color name="titletextcolor">#FFFF00</color>
</resources>

В AndroidMANIFEST.xml установите атрибут темы либо в приложении (для всего приложения), либо в тегах действия (только это действие).

<activity android:name=".CustomTitleBar" android:theme="@style/customTheme" ...

Из Activity (называемого CustomTitleBar):

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
        setContentView(R.layout.main);
        getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.mytitle);

}
Ccheneson
источник
9
В большинстве случаев просто предоставление ссылки очень дешево, а на stackoverflow не очень нравится ответ. Попытайтесь получить некоторые сведения из ссылки на этой странице. Вы будете получать все больше и больше знаний в сообществе, и даже если ссылка недоступна, ваш ответ по-прежнему содержит некоторые условия поиска, которые могут направить других людей в нужном направлении.
Януш
7
@Janusz: Вы совершенно правы - поэтому я обновил пост самым простым образцом, чтобы люди могли начать с него, вместо того, чтобы читать
ветку
3
После перезаписи стиля Android вам не нужно добавлять пользовательский заголовок из кода, если вы просто хотите изменить цвет фона
Януш,
1
Как сказал Януш, вам не нужно иметь настраиваемый вид, если вы хотите только переопределить используемый стиль (не добавляя новые представления). В этом случае вам также не нужно запрашивать FEATURE_CUSTOM_STYLE. Наконец, вы можете определить стиль на уровне приложения, чтобы применить его ко всем вашим действиям сразу. Кстати, спасибо за код.
Эрик Кок
2
это не меняет цвет фона заголовка, меняется только цвет текста. даже если я меняю цвет строки заголовка <color name = "titlebackgroundcolor"> # 3232CD </color>. Я делаю что-то неправильно?
Шайста Нааз,
18

Спасибо за это ясное объяснение, однако я хотел бы добавить немного больше к вашему ответу, задав связанный вопрос (на самом деле не хочу делать новый пост, поскольку этот является основанием для моего вопроса).

Я объявляю свою панель заголовка в суперклассе, из которого все остальные мои действия являются дочерними, поэтому мне нужно изменить цвет полосы только один раз. Я хотел бы также добавить значок и изменить текст в панели. Я провел некоторое тестирование, и мне удалось изменить либо одно, либо другое, но не оба одновременно (используя setFeatureDrawable и setTitle). Идеальным решением было бы, конечно, следовать объяснениям в потоке, приведенном в ссылке, но, поскольку я объявляю в суперклассе, у меня есть проблема из-за макета в setContentView и R.id.myCustomBar, потому что если я хорошо помните, я могу вызвать setContentView только один раз ...

ИЗМЕНИТЬ Нашел мой ответ:

Для тех, кто, как и я, любит работать с суперклассами, потому что это отлично подходит для того, чтобы меню было доступно повсюду в приложении, здесь оно работает так же.

Просто добавьте это в свой суперкласс:

requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
    setContentView(R.layout.customtitlebar);
    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.customtitlebar);
    customTitleText = (TextView) findViewById(R.id.customtitlebar);

(вы должны объявить текстовое представление как защищенную переменную класса)

И тогда сила этого заключается в том, что везде в вашем приложении (если, например, все ваши действия являются дочерними элементами этого класса), вам просто нужно вызвать

customTitleText.setText("Whatever you want in title");

и ваша заголовок будет отредактирован.

В моем случае связанный XML (R.layout.customtitlebar):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:background="@color/background">
<ImageView android:layout_width="25px" android:layout_height="25px"
    android:src="@drawable/icontitlebar"></ImageView>
<TextView android:id="@+id/customtitlebar"
    android:layout_width="wrap_content" android:layout_height="fill_parent"
    android:text="" android:textColor="@color/textcolor" android:textStyle="bold"
    android:background="@color/background" android:padding="3px" />
</LinearLayout>
Сефи
источник
Почему меня отвергают? что не так с моим кодом? у меня он отлично работает ...
Sephy
1
будучи новичком, я чувствую, что это хороший фрагмент кода с хорошим объяснением. +1 для вас !!!
RK
@Sephy, мне нужно создать другой класс для строки заголовка, тогда только я могу его использовать?
Викас Гупта
здесь не работает stackoverflow.com/questions/31157222/…
Адитья
11

Есть другой способ изменить цвет фона, однако это взлом, и он может не работать в будущих версиях Android, если изменится иерархия представления окна и его заголовок. Однако код не выйдет из строя, просто пропустите установку желаемого цвета в таком случае.

В своей деятельности, например в onCreate, выполните:

View titleView = getWindow().findViewById(android.R.id.title);
if (titleView != null) {
  ViewParent parent = titleView.getParent();
  if (parent != null && (parent instanceof View)) {
    View parentView = (View)parent;
    parentView.setBackgroundColor(Color.rgb(0x88, 0x33, 0x33));
  }
}
микрофон
источник
очень хороший и простой тоже. Но я хочу спросить вас об одном: этот делает это из кода, поэтому это немного задерживается. Чтобы избежать такой ситуации, мне придется писать все в xml и ничего в коде. не могли бы вы помочь мне в этом?
Shaista Naaz
Я думаю, что у вас есть решение в выбранном выше ответе. Вам необходимо определить настраиваемую тему для действия и установить для его android: windowTitleBackgroundStyle нужный цвет.
mikeplate
7

Этот код помогает программно изменить фон строки заголовка в Android. Измените цвет на любой, какой хотите.

public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_layout);
    getActionBar().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#1c2833")));

}
Эдвинфад
источник
Это было введено в API 11 (3.0 Honeycomb), который, безусловно, достаточно устарел на данный момент, чтобы считать это допустимым вариантом.
zgc7009
Но я все еще использую его во всех своих последних приложениях с targetSdkVersion = "23", не получая никакой устаревшей информации.
Эдвинфад
Безусловно, это на 100% нормально. Он ничем не заменен, но следует избегать его использования до API 11 (что очень немногие люди будут делать), по крайней мере, без библиотеки совместимости.
zgc7009
Принято к сведению. @ zgc7009
Edwinfad
1
Используйте getSupportActionBar () вместо этого, если вы используете AppCompatActivity
mondlos,
6
protected void onCreate(Bundle savedInstanceState) {        
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    View titleView = getWindow().findViewById(android.R.id.title);
    if (titleView != null) {
      ViewParent parent = titleView.getParent();
      if (parent != null && (parent instanceof View)) {
        View parentView = (View)parent;
        parentView.setBackgroundColor(Color.RED);
      }
    }

в приведенном выше коде вы можете попробовать использовать заголовок вместо заголовка, это повлияет на все действия в вашем приложении

Пратиштха Гория
источник
2

Полагаю, нет. Вы можете создать действие без названия и создать собственную строку заголовка в макете действия.

Отметьте это , строка 63 и ниже:

getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_1)

устанавливает customview вместо просмотра заголовка по умолчанию.

небесный человек
источник
Как / где я могу создать собственную строку заголовка?
Thizzer
2

Загляните в platforms/android-2.1/data/res/layout/screen.xmlSDK. Вроде бы определение там названия. Вы можете часто проверять такие макеты и заимствовать style="?android:attr/windowTitleStyle" стили, которые затем можно использовать и переопределить в своих собственных TextView.

Вы можете даже выбрать заголовок для прямой настройки, выполнив:

TextView title = (TextView)findViewById(android.R.id.title);
Стив Помрой
источник
1
Хорошие ответы выше, но можно ли просто раскрасить строку заголовка, не создавая для нее собственный макет?
Eno
2

Попробуйте использовать следующий код

View titleView = getWindow().findViewById(android.R.id.title);
    if (titleView != null) {
      ViewParent parent = titleView.getParent();
      if (parent != null && (parent instanceof View)) {
        View parentView = (View)parent;
        parentView.setBackgroundColor(Color.RED);
      }
    }

также используйте эту ссылку, она очень полезна: http://nathanael.hevenet.com/android-dev-changing-the-title-bar-background/

Пратик Бутани
источник
Это все еще работает с Lollipop? titleView, кажется, возвращает мне значение null.
WORMSS 05
1

Существует более простая альтернатива - изменить цвет строки заголовка, используя библиотеку поддержки v7 appcompat, предоставленную Google.

См. Эту ссылку о том, как настроить эту библиотеку поддержки: https://developer.android.com/tools/support-library/setup.html

Как только вы это сделаете, достаточно добавить следующие строки в ваш файл res / values ​​/ styles.xml:

<style name="AppTheme" parent="AppBaseTheme">
    <item name="android:actionBarStyle">@style/ActionBar</item>
</style>

<!-- Actionbar Theme -->
<style name="ActionBar" parent="Widget.AppCompat.Light.ActionBar.Solid.Inverse">
    <item name="android:background">@color/titlebackgroundcolor</item>
</style>

(при условии, что titlebackgroundcolor определен в вашем res / values ​​/ colors.xml, например:

<color name="titlebackgroundcolor">#0000AA</color>

)

stefan.m
источник
Если вы ориентируетесь только на Android 5, есть еще более простая альтернатива, см. [ Developer.android.com/training/material/… .
stefan.m
1

Похоже, что с Android 5.0 (уровень API 21) все стало лучше / проще.

Я думаю, что вы ищете что-то вроде этого:

<style name="AppTheme" parent="AppBaseTheme">
    <!-- Top-top notification/status bar color: -->
    <!--<item name="colorPrimaryDark">#000000</item>-->
    <!-- App bar color: -->
    <item name="colorPrimary">#0000FF</item>
</style>

См. Здесь для справки:

https://developer.android.com/training/material/theme.html#ColorPalette

Лойсаида Сэм Сандберг
источник
1

Я сделал это, изменив значения цвета стиля в "res" -> "values" -> "colors.xml" введите описание изображения здесь

Это изменит цвета для всего проекта, что меня устраивает.

введите описание изображения здесь

Брля
источник
0

вы можете использовать это.

  toolbar.setTitleTextColor(getResources().getColor(R.color.white));
Павел
источник
0

Вставьте этот код после setContentView или в onCreate

если у вас есть цветовой код, используйте это;

getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#408ed4")));

если вы хотите использовать конкретный код из библиотеки цветов;

getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.WHITE));
Абдулла Алкиш
источник