Встановити колір тла заголовка


106

У моєму додатку для Android я хочу, щоб стандартний / базовий рядок заголовка змінив колір.

Щоб змінити колір тексту, який у вас є setTitleColor(int color), чи є спосіб змінити колір тла смуги?


Думаю, не потрібно використовувати спеціальний заголовок, щоб змінити колір тла на рядок заголовка. перевірити цей пост
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 ​​/ color.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);

}

9
Більшість часу просто надання посилання - це дуже дешево, і на stackoverflow не дуже сподобалась відповідь. Спробуйте отримати деякі знання зі посилання на цю сторінку. Ви будете отримувати все більше і більше знань у громаді, і навіть якщо посилання не працює, ви відповісте, все одно містять деякі пошукові терміни, які можуть спрямовувати інших людей у ​​напрямку.
Януш

7
@Janusz: Ви абсолютно праві - Тож я оновив пост найпростішим зразком, щоб люди могли розпочати роботу замість того, щоб прочитати нитку у вищенаведеному посиланні
ccheneson

3
Після заміни стилю андроїд вам не потрібно додавати спеціальний заголовок із коду, якщо ви просто хочете змінити колір тла
Janusz

1
Як сказав Януш, вам не потрібно мати спеціальний перегляд, якщо ви хочете лише змінити використаний стиль (не додаючи нові перегляди). У такому випадку вам також не потрібно запитувати FEATURE_CUSTOM_STYLE. Нарешті, ви можете визначити стиль на рівні програми, щоб застосувати його до всіх ваших дій одночасно. Дякуємо за код, до речі.
Ерік Кок

2
це не змінює колір тла заголовка, змінюється лише колір тексту. навіть якщо я змінюю колір заголовка <color name = "titlebackgroundcolor"> # 3232CD </color>. Я щось роблю не так?
Шаїста Нааз

18

Дякую за це чітке пояснення, проте я хотів би додати трохи більше до вашої відповіді, задавши пов’язане запитання (не дуже хочеться робити нову посаду, оскільки ця є підвалом мого запитання).

Я оголошую свій титульний рядок в суперкласі, з якого всі інші мої дії - це діти, які повинні змінити колір смужки лише один раз. Я також хотів би додати піктограму та змінити текст у рядку. Я провів кілька тестувань і встиг змінити або те, і інше, але не обидва одночасно (використовуючи setFeatureDravable та 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>

Чому мене проголосують? що не так з моїм кодом? це чудово працює для мене ...
Sephy

1
Будучи початківцем, я відчуваю, що вище приємний фрагмент коду з хорошими поясненнями. +1 для вас !!!
РК

@Sephy Чи потрібно робити різний клас для рядка заголовка, тоді тільки я можу ним користуватися?
Вікас Гупта


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 і нічого в код. тож чи можете ви мене просимо в цьому?
Шаїста Нааз

Я думаю, що у вас є рішення в обраній відповіді вище. Вам потрібно визначити власну тему для діяльності та встановити її android: windowTitleBackgroundStyle на потрібний колір.
міксель

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 стільника соти), що, безумовно, є досить застарілим на даний момент, щоб вважати це правильним варіантом.
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.xmlна SDK. Здається, там визначено назву. Ви можете часто досліджувати такі макети і позичати їх style="?android:attr/windowTitleStyle" стилі, які ви зможете потім використовувати та змінювати у власних TextViews.

Ви можете навіть вибрати заголовок для прямого налаштування, виконавши:

TextView title = (TextView)findViewById(android.R.id.title);

1
Хороші відповіді вище, але чи можна просто забарвити рядок заголовка, не створюючи для нього спеціальний макет?
Ено

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, здається, повертає нульовий для мене.
СВЯТЛЕННЯ

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 ​​/ color.xml, наприклад:

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

)


Якщо ви орієнтуєтеся лише на Android 5, то є ще простіша альтернатива, див. [ Developer.android.com/training/material/… .
stefan.m

1

Начебто речі ставали кращими / легшими після Android 5.0 (рівень 21 API).

Я думаю, що ти шукаєш щось таке:

<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" -> "color.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));
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.