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

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

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

Ответ 1

Этот поток начнет с создания собственной строки заголовка в XML файле и использования его в ваших действиях

Edit

Ниже приведен краткий обзор содержимого ссылки выше. Это просто, чтобы установить цвет текста и фона строки заголовка - без изменения размера, без кнопок, просто самых простых образец

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

}

Ответ 2

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

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

Ответ 3

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

Ответ 4

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 это повлияет на всю активность вашего приложения.

Ответ 5

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

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

}

Ответ 6

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

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

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

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

Ответ 7

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

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

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

Ответ 8

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

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/

Ответ 9

Существует более простая альтернатива изменению цвета строки заголовка, используя библиотеку поддержки 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>

)

Ответ 10

Кажется, что все стало лучше/проще с 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