Đặt màu nền tiêu đề


106

Trong ứng dụng Android của mình, tôi muốn thanh tiêu đề tiêu chuẩn / cơ bản thay đổi màu.

Để thay đổi màu chữ bạn có setTitleColor(int color), có cách nào để thay đổi màu nền của thanh không?


Tôi nghĩ không cần sử dụng tiêu đề tùy chỉnh để thay đổi màu nền cho thanh tiêu đề. kiểm tra bài này
Deepthi Jabili

Tôi sẽ xem xét câu trả lời của Edwinfad thay vì câu trả lời đã được chấp nhận lỗi thời.
zgc7009

Câu trả lời:


186

Đây chủ đề sẽ giúp bạn bắt đầu với việc xây dựng thanh tiêu đề của riêng bạn trong một file xml và sử dụng nó trong các hoạt động của bạn

Biên tập

Đây là tóm tắt ngắn gọn về nội dung của liên kết trên - Đây chỉ là để thiết lập màu sắc của văn bản và nền của thanh tiêu đề - không thay đổi kích thước, không có nút, chỉ là mẫu đơn giản nhất

res / layout / mytitle.xml - Đây là dạng xem sẽ đại diện cho thanh tiê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 - Chúng tôi muốn giữ chủ đề android mặc định và chỉ cần thay đổi màu nền của nền tiêu đề. Vì vậy, chúng tôi tạo một chủ đề kế thừa chủ đề mặc định và đặt kiểu nền theo phong cách riêng của chúng tôi.

<?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 - Đây là nơi chúng tôi đặt chủ đề để sử dụng màu chúng tôi muốn cho nền tiê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 - Đặt ở đây màu bạn muốn

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

Trong AndroidMANIFEST.xml , hãy đặt thuộc tính chủ đề trong ứng dụng (cho toàn bộ ứng dụng) hoặc trong thẻ hoạt động (chỉ hoạt động này)

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

Từ Hoạt động (được gọi là 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
Hầu hết thời gian chỉ cung cấp một liên kết là một câu trả lời rất rẻ và trên stackoverflow không thực sự thích câu trả lời. Cố gắng lấy một số kiến ​​thức từ liên kết đến trang này. Bạn sẽ ngày càng nhận được nhiều kiến ​​thức hơn trong cộng đồng, và ngay cả khi liên kết bị ngắt, bạn trả lời vẫn cung cấp một số cụm từ tìm kiếm có thể hướng người khác theo hướng.
Janusz

7
@Janusz: Bạn đang hoàn toàn đúng - Vì vậy, tôi cập nhật các bài với các mẫu đơn giản nhất để mọi người có thể bắt đầu với thay vì đọc thông qua các chủ đề trong diễn đàn
ccheneson

3
Sau khi ghi đè lên phong cách android bạn không cần phải thêm tiêu đề tùy chỉnh từ mã nếu bạn chỉ muốn thay đổi màu nền
Janusz

1
Như Janusz đã nói, bạn không cần phải có Chế độ xem tùy chỉnh nếu bạn chỉ muốn ghi đè kiểu đã sử dụng (không thêm Chế độ xem mới). Trong trường hợp đó, bạn cũng không cần yêu cầu FEATURE_CUSTOM_STYLE. Cuối cùng, bạn có thể xác định kiểu một cấp ứng dụng để áp dụng nó cho tất cả các hoạt động của bạn cùng một lúc. Nhân tiện, cảm ơn vì mã này.
Eric Kok

2
điều này không làm thay đổi màu nền của tiêu đề chỉ có màu văn bản được thay đổi. ngay cả khi tôi đang thay đổi màu của thanh tiêu đề <color name = "titlebackgroundcolor"> # 3232CD </color>. Tôi có làm điều gì sai?
Shaista Naaz

18

Cảm ơn vì lời giải thích rõ ràng này, tuy nhiên tôi muốn bổ sung thêm một chút cho câu trả lời của bạn bằng cách đặt một câu hỏi được liên kết (không thực sự muốn tạo một bài mới vì đây là cơ sở cho câu hỏi của tôi).

Tôi đang khai báo thanh tiêu đề của mình trong một Superclass mà từ đó, tất cả các hoạt động khác của tôi đều là trẻ em, chỉ phải thay đổi màu của thanh một lần. Tôi cũng muốn thêm một biểu tượng và thay đổi văn bản trong thanh. Tôi đã thực hiện một số thử nghiệm và quản lý để thay đổi một trong hai nhưng không phải cả hai cùng một lúc (sử dụng setFeatureDrawable và setTitle). Giải pháp lý tưởng tất nhiên sẽ là làm theo lời giải thích trong chuỗi được đưa ra trong liên kết, nhưng vì tôi đang khai báo trong lớp cha, tôi gặp sự cố do bố cục trong setContentView và R.id.myCustomBar, vì nếu tôi hãy nhớ kỹ tôi chỉ có thể gọi setContentView một lần ...

EDIT Đã tìm thấy câu trả lời của tôi:

Đối với những người, giống như tôi, thích làm việc với các lớp cha bởi vì điều này thật tuyệt khi có một menu có sẵn ở mọi nơi trong một ứng dụng, nó hoạt động tương tự ở đây.

Chỉ cần thêm cái này vào lớp cha của bạn:

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

(bạn phải khai báo textview là biến lớp được bảo vệ)

Và sức mạnh của điều này là ở mọi nơi trong ứng dụng của bạn (ví dụ: nếu tất cả các hoạt động của bạn là trẻ em của lớp này), bạn chỉ cần gọi

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

và thanh tiêu đề của bạn sẽ được chỉnh sửa.

XML được liên kết trong trường hợp của tôi là (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>

Tại sao tôi lại bị bỏ phiếu? có gì sai với mã của tôi? nó hoạt động hoàn hảo đối với tôi ...
Sephy

1
là một người mới bắt đầu, tôi cảm thấy rằng trên đây là một đoạn mã hay với cách giải thích tốt. +1 cho bạn !!!
RK

@Tại sao tôi phải tạo lớp khác cho thanh tiêu đề thì chỉ tôi mới có thể sử dụng nó?
Vikas Gupta

nó không hoạt động ở đây stackoverflow.com/questions/31157222/…
Aditya

11

Có một cách khác để thay đổi màu nền, tuy nhiên đây là một cách hack và có thể không thành công trên các phiên bản Android trong tương lai nếu phân cấp Chế độ xem của Cửa sổ và tiêu đề của nó bị thay đổi. Tuy nhiên, mã sẽ không bị lỗi, chỉ cần bỏ lỡ thiết lập màu mong muốn, trong trường hợp như vậy.

Trong Hoạt động của bạn, như onCreate, hãy làm:

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

rất tốt và đơn giản quá. Nhưng tôi muốn hỏi bạn một điều rằng cái này đang làm nó từ mã nên nó hơi bị trễ. Để tránh tình huống như vậy, tôi sẽ phải viết mọi thứ trong xml và không có gì trong mã. vì vậy bạn có thể vui lòng hướng dẫn tôi trong đó?
Shaista Naaz

Tôi nghĩ bạn có giải pháp trong câu trả lời đã chọn ở trên. Bạn cần xác định chủ đề tùy chỉnh cho hoạt động và đặt android: windowTitleBackgroundStyle của nó thành màu bạn muốn.
mikeplate

7

Mã này giúp thay đổi nền của thanh tiêu đề theo chương trình trong Android. Thay đổi màu thành bất kỳ màu nào bạn muốn.

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

}

Điều này đã được giới thiệu trong API 11 (3.0 Honeycomb), chắc chắn đã lỗi thời vào thời điểm này để coi đây là một tùy chọn hợp lệ.
zgc7009

Nhưng tôi vẫn đang sử dụng nó trong tất cả các ứng dụng gần đây của mình với targetSdkVersion = "23" mà không nhận được bất kỳ thông tin nào không dùng nữa.
Edwinfad

Tuyệt đối, nó là 100% tốt để sử dụng này. Nó chưa được thay thế bằng bất kỳ thứ gì, nhưng nên tránh sử dụng nó trước API 11 (điều mà rất ít người sẽ làm) nên tránh, ít nhất là không có thư viện tương thích.
zgc7009

Ghi chú. @ zgc7009
Edwinfad

1
Sử dụng getSupportActionBar () thay thế nếu bạn đang sử dụng 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);
      }
    }

trên đoạn mã trên, bạn có thể thử, bạn có thể sử dụng tiêu đề thay vì thanh tiêu đề, điều này sẽ ảnh hưởng đến tất cả hoạt động trong ứng dụng của bạn


2

Tôi cho là không. Bạn có thể tạo hoạt động vô danh và tạo thanh tiêu đề của riêng mình trong bố cục hoạt động.

Kiểm tra cái này , Dòng 63 trở xuống:

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

đặt chế độ xem tùy chỉnh thay vì chế độ xem tiêu đề mặc định.


Tôi có thể tạo thanh tiêu đề tùy chỉnh / riêng ở đâu?
Thizzer 17/02/10

2

Xem platforms/android-2.1/data/res/layout/screen.xmlqua SDK. Nó dường như xác định một tiêu đề ở đó. Bạn có thể thường xuyên kiểm tra các bố cục như thế này và mượn các style="?android:attr/windowTitleStyle" kiểu mà sau đó bạn có thể sử dụng và ghi đè trong TextView của riêng bạn.

Bạn thậm chí có thể chọn tiêu đề để điều chỉnh trực tiếp bằng cách thực hiện:

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

1
Câu trả lời hay ở trên nhưng liệu có thể chỉ tô màu cho thanh tiêu đề mà không cần phải tạo bố cục tùy chỉnh cho nó không?
Eno

2

Hãy thử với mã sau

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

cũng sử dụng liên kết này rất hữu ích của nó: http://nathanael.hevenet.com/android-dev-changed-the-title-bar-background/


Điều này vẫn hoạt động với Lollipop? titleView dường như trả về null cho tôi.
WORMSS

1

Có một giải pháp thay thế dễ dàng hơn để thay đổi màu sắc của thanh tiêu đề, bằng cách sử dụng thư viện hỗ trợ appcompat v7 do Google cung cấp.

Xem liên kết này về cách thiết lập thư viện hỗ trợ này: https://developer.android.com/tools/support-library/setup.html

Khi bạn đã làm xong, chỉ cần thêm các dòng sau vào tệp res / values ​​/ styles.xml của bạn là đủ:

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

(giả sử rằng "titlebackgroundcolor" được xác định trong res / values ​​/ Colors.xml của bạn, ví dụ:

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

)


Khi bạn chỉ nhắm mục tiêu đến Android 5, thì có một giải pháp thay thế thậm chí còn đơn giản hơn, hãy xem [ developer.android.com/training/material/… .
stefan.m

1

Mọi thứ dường như trở nên tốt hơn / dễ dàng hơn kể từ Android 5.0 (API cấp 21).

Tôi nghĩ những gì bạn đang tìm kiếm là một cái gì đó như thế này:

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

Xem tại đây để tham khảo:

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


1

Tôi đã làm điều này bằng cách thay đổi giá trị màu kiểu trong "res" -> "values" -> "Colors.xml" nhập mô tả hình ảnh ở đây

Điều này sẽ thay đổi màu sắc cho toàn bộ dự án, điều này tốt với tôi.

nhập mô tả hình ảnh ở đây


0

bạn co thể sử dụng no.

  toolbar.setTitleTextColor(getResources().getColor(R.color.white));

0

Dán mã này sau setContentView hoặc vào onCreate

nếu bạn có mã màu, hãy sử dụng cái này;

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

nếu bạn muốn một mã cụ thể từ Thư viện màu, hãy sử dụng cái này;

getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.WHITE));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.