Установить цвет фона заголовка - PullRequest
105 голосов
/ 12 февраля 2010

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

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

Ответы [ 12 ]

186 голосов
/ 18 февраля 2010

Эта тема поможет вам создать собственную строку заголовка в 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" ...

Из действия (называемого 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);

}
18 голосов
/ 27 апреля 2010

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

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

EDIT Нашел мой ответ:

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

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

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>
11 голосов
/ 02 декабря 2010

Существует еще один способ изменить цвет фона, однако это взломанный файл, который может не сработать в будущих версиях 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));
  }
}
6 голосов
/ 21 ноября 2016

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

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

}
6 голосов
/ 05 апреля 2013
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);
      }
    }

в приведенном выше коде вы можете попробовать использовать title вместо titlebar это повлияет на всю активность в вашем приложении

2 голосов
/ 05 апреля 2013

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

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/

2 голосов
/ 18 февраля 2010

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

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

TextView title = (TextView)findViewById(android.R.id.title);
2 голосов
/ 12 февраля 2010

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

Проверьте это , строка 63 и ниже:

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

устанавливает пользовательский вид вместо заголовка по умолчанию.

1 голос
/ 20 октября 2018

Я сделал это, изменив цветовые значения стиля в "res" -> "values" -> "colors.xml" enter image description here

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

enter image description here

1 голос
/ 07 декабря 2017

С 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...