Ustaw kolor tła tytułu

106

W mojej aplikacji na Androida chcę, aby standardowy / podstawowy pasek tytułu zmienił kolor.

Aby zmienić kolor tekstu, czy setTitleColor(int color)jest sposób na zmianę koloru tła paska?

Thizzer
źródło
Myślę, że nie ma potrzeby używania niestandardowego tytułu, aby zmienić kolor tła na pasek tytułu. sprawdź ten post
Deepthi Jabili
Spojrzałbym na odpowiedź Edwinfada zamiast na nieaktualną, zaakceptowaną.
zgc7009

Odpowiedzi:

186

Ten wątek pozwoli Ci rozpocząć tworzenie własnego paska tytułu w pliku xml i używanie go w swoich działaniach

Edytować

Oto krótkie podsumowanie zawartości powyższego linku - służy to tylko ustawieniu koloru tekstu i tła paska tytułu - bez zmiany rozmiaru, bez przycisków, tylko najprostsza próbka

res / layout / mytitle.xml - To jest widok, który będzie reprezentował pasek tytułu

<?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 - Chcemy zachować domyślny motyw Androida i wystarczy zmienić kolor tła tytułu. Dlatego tworzymy motyw, który dziedziczy motyw domyślny i ustawiamy styl tła na nasz własny styl.

<?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 - w tym miejscu ustawiamy motyw tak, aby używał żądanego koloru tła tytułu

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

res / values ​​/ colors.xml - Ustaw tutaj żądany kolor

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

W AndroidMANIFEST.xml ustaw atrybut motywu w aplikacji (dla całej aplikacji) lub w tagach działania (tylko to działanie)

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

Z działania (o nazwie 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
źródło
9
W większości przypadków samo podanie linku jest bardzo tanie, a na przepływie stosów odpowiedź nie jest zbyt podobna. Spróbuj uzyskać część wiedzy z linku na tej stronie. Będziesz zdobywać coraz większą wiedzę w społeczności, a nawet jeśli link jest wyłączony, odpowiedź nadal zawiera pewne wyszukiwane hasła, które mogą skierować inne osoby w odpowiednim kierunku.
Janusz
7
@Janusz: Masz całkowitą rację - zaktualizowałem więc post z najprostszą próbką, aby ludzie mogli zacząć zamiast czytać wątek w powyższym linku
ccheneson
3
Po nadpisaniu stylizacji Androida nie musisz dodawać własnego tytułu z kodu, jeśli chcesz tylko zmienić kolor tła
Janusz
1
Jak powiedział Janusz, nie musisz mieć własnego widoku, jeśli chcesz tylko nadpisać używany styl (nie dodawać nowych widoków). W takim przypadku nie musisz też prosić o FEATURE_CUSTOM_STYLE. Na koniec możesz zdefiniować styl i poziom aplikacji, aby zastosować go do wszystkich działań jednocześnie. Nawiasem mówiąc, dzięki za kod.
Eric Kok
2
nie zmienia to koloru tła tytułu, zmienia się tylko kolor tekstu. nawet jeśli zmieniam kolor paska tytułu <color name = "titlebackgroundcolor"> # 3232CD </color>. czy robię coś źle?
Shaista Naaz
18

Dziękuję za to jasne wyjaśnienie, jednak chciałbym dodać trochę więcej do Twojej odpowiedzi, zadając pytanie z linkiem (nie chcę pisać nowego postu, ponieważ ten jest podstawą mojego pytania).

Deklaruję, że mój pasek tytułowy w superklasie, z której wszystkie moje zajęcia są dziećmi, musi zmienić kolor paska tylko raz. Chciałbym też dodać ikonę i zmienić tekst w pasku. Zrobiłem kilka testów i udało mi się zmienić jedno lub drugie, ale nie oba w tym samym czasie (używając setFeatureDrawable i setTitle). Idealnym rozwiązaniem byłoby oczywiście podążanie za wyjaśnieniem w wątku podanym w linku, ale jak deklaruję w nadklasie, mam problem z układem w setContentView i R.id.myCustomBar, ponieważ jeśli i dobrze pamiętam, mogę wywołać setContentView tylko raz ...

EDYTUJ Znaleziono moją odpowiedź:

Dla tych, którzy, tak jak ja, lubią pracować z nadklasami, ponieważ świetnie nadaje się do uzyskania menu dostępnego w każdym miejscu w aplikacji, tutaj działa tak samo.

Po prostu dodaj to do swojej superklasy:

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

(musisz zadeklarować textview jako chronioną zmienną klasową)

Siła tego polega na tym, że wszędzie w aplikacji (jeśli na przykład wszystkie Twoje zajęcia są dziećmi tej klasy), wystarczy zadzwonić

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

a twój pasek tytułowy zostanie edytowany.

XML skojarzony w moim przypadku to (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
źródło
Dlaczego zostałem odrzucony? co jest nie tak z moim kodem? to działa idealnie dla mnie ...
Sephy
1
jako początkujący uważam, że powyższy fragment kodu zawiera dobre wyjaśnienia. +1 dla Ciebie !!!
RK
@Sephy czy muszę utworzyć inną klasę dla paska tytułu, czy tylko mogę jej używać?
Vikas Gupta
to nie działa tutaj stackoverflow.com/questions/31157222/ ...
Aditya
11

Istnieje inny sposób zmiany koloru tła, jednak jest to hack i może się nie powieść w przyszłych wersjach Androida, jeśli zmieni się hierarchia widoku okna i jego tytuł. Jednak kod się nie zawiesza, wystarczy pominąć ustawienie żądanego koloru, w takim przypadku.

W swojej aktywności, podobnie jak onCreate, wykonaj:

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));
  }
}
mikeplate
źródło
bardzo dobry i prosty. Ale chcę cię zapytać o jedną rzecz, że ten robi to z kodu, więc jest trochę opóźniony. Żeby uniknąć takiej sytuacji będę musiał napisać wszystko w xml i nic w kodzie. więc czy możesz mnie w tym poprowadzić?
Shaista Naaz
Myślę, że masz rozwiązanie w wybranej odpowiedzi powyżej. Musisz zdefiniować motyw niestandardowy dla działania i ustawić jego android: windowTitleBackgroundStyle na żądany kolor.
mikeplate
7

Ten kod pomaga programowo zmienić tło paska tytułu w systemie Android. Zmień kolor na dowolny.

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

}
Edwinfad
źródło
Zostało to wprowadzone w API 11 (3.0 Honeycomb), które z pewnością jest na tyle przestarzałe w tym momencie, aby uznać to za ważną opcję.
zgc7009
Ale nadal używam go we wszystkich moich ostatnich aplikacjach z targetSdkVersion = "23" bez uzyskiwania informacji przestarzałych.
Edwinfad
Absolutnie jest to w 100% w porządku. Nie został on niczym zastąpiony, ale należy unikać używania go przed API 11 (co robi bardzo niewiele osób), przynajmniej bez biblioteki kompatybilności.
zgc7009
Odnotowany. @ zgc7009
Edwinfad
1
Zamiast tego użyj getSupportActionBar (), jeśli używasz 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);
      }
    }

na powyższym kodzie możesz spróbować użyć tytułu zamiast paska tytułu , wpłynie to na całą aktywność w Twojej aplikacji

Pratishtha Goriya
źródło
2

Chyba nie. Możesz tworzyć działania bez tytułów i tworzyć własne paski tytułu w układzie działań.

Sprawdź to , wiersz 63 i poniżej:

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

ustawia widok niestandardowy zamiast domyślnego widoku tytułu.

skyman
źródło
Jak / gdzie mogę stworzyć własny / własny pasek tytułu?
Thizzer
2

Rzuć okiem platforms/android-2.1/data/res/layout/screen.xmlna SDK. Wydaje się, że definiuje tam tytuł. Możesz często sprawdzać takie układy i pożyczać style="?android:attr/windowTitleStyle" style, których możesz następnie używać i nadpisywać we własnych TextViews.

Możesz nawet wybrać tytuł do bezpośredniego dostosowania, wykonując:

TextView title = (TextView)findViewById(android.R.id.title);
Steve Pomeroy
źródło
1
Dobre odpowiedzi powyżej, ale czy można po prostu pokolorować pasek tytułu bez konieczności tworzenia dla niego niestandardowego układu?
Eno
2

Spróbuj z następującym kodem

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

również użyj tego linku, jego bardzo przydatny: http://nathanael.hevenet.com/android-dev-changing-the-title-bar-background/

Pratik Butani
źródło
Czy to nadal działa z Lollipopem? titleView wydaje mi się zwracać wartość null.
WORMSS
1

Istnieje łatwiejsza alternatywa zmiany koloru paska tytułu, korzystając z biblioteki obsługi zgodności aplikacji v7 dostarczonej przez Google.

Zobacz ten link, aby dowiedzieć się, jak skonfigurować tę bibliotekę pomocy: https://developer.android.com/tools/support-library/setup.html

Gdy to zrobisz, wystarczy dodać następujące wiersze do pliku 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>

(zakładając, że "titlebackgroundcolor" jest zdefiniowany w twoim res / values ​​/ colors.xml, np .:

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

)

stefan.m
źródło
Jeśli celujesz tylko w Androida 5, istnieje jeszcze prostsza alternatywa, zobacz [ developer.android.com/training/material/… .
stefan.m
1

Wydaje się, że od czasu Androida 5.0 (poziom interfejsu API 21) sytuacja się poprawiła / łatwiej.

Myślę, że szukasz czegoś takiego:

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

Zobacz tutaj w celach informacyjnych:

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

Loisaida Sam Sandberg
źródło
1

Zrobiłem to, zmieniając wartości kolorów stylu w „res” -> „values” -> „colors.xml” wprowadź opis obrazu tutaj

To zmieni kolory dla całego projektu, co mi odpowiada.

wprowadź opis obrazu tutaj

Brlja
źródło
0

możesz tego użyć.

  toolbar.setTitleTextColor(getResources().getColor(R.color.white));
pavel
źródło
0

Wklej ten kod po setContentView lub do onCreate

jeśli masz kod koloru, użyj tego;

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

jeśli chcesz mieć określony kod z biblioteki Color, użyj tego;

getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.WHITE));
Abdullah alkış
źródło