ตั้งค่าสีพื้นหลังของชื่อเรื่อง


106

ในแอปพลิเคชัน Android ของฉันฉันต้องการให้แถบหัวเรื่องมาตรฐาน / พื้นฐานเปลี่ยนสี

หากต้องการเปลี่ยนสีข้อความที่คุณมีsetTitleColor(int color)มีวิธีเปลี่ยนสีพื้นหลังของแถบหรือไม่?


ฉันคิดว่าไม่จำเป็นต้องใช้ชื่อที่กำหนดเองเพื่อเปลี่ยนสีพื้นหลังเป็นแถบหัวเรื่อง ตรวจสอบโพสต์นี้
Deepthi Jabili

ฉันจะดูคำตอบของ Edwinfad แทนคำตอบที่ยอมรับที่ล้าสมัย
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 ​​/ 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);

}

9
เวลาส่วนใหญ่เพียงแค่ให้ลิงค์เป็นราคาถูกมากและใน stackoverflow ไม่ชอบคำตอบจริงๆ ลองรับความรู้จากลิงค์ในหน้านี้ คุณจะได้รับความรู้มากขึ้นเรื่อย ๆ ในชุมชนและแม้ว่าลิงก์จะไม่อยู่คุณก็ตอบได้ แต่ก็ยังมีคำค้นหาบางคำที่สามารถชี้นำคนอื่นไปในทิศทางได้
Janusz

7
@ Janusz: คุณพูดถูก - ดังนั้นฉันจึงอัปเดตโพสต์ด้วยตัวอย่างที่ง่ายที่สุดเพื่อให้ผู้คนสามารถเริ่มต้นใช้งานได้แทนที่จะอ่านกระทู้ในลิงค์ด้านบน
ccheneson

3
หลังจากเขียนทับสไตล์ Android แล้วคุณไม่จำเป็นต้องเพิ่มชื่อที่กำหนดเองจากรหัสหากคุณต้องการเปลี่ยนสีพื้นหลัง
Janusz

1
ดังที่ Janusz กล่าวไว้คุณไม่จำเป็นต้องมีมุมมองที่กำหนดเองหากคุณต้องการลบล้างสไตล์ที่ใช้เท่านั้น (ไม่ได้เพิ่มมุมมองใหม่) ในกรณีนี้คุณไม่จำเป็นต้องขอ FEATURE_CUSTOM_STYLE สุดท้ายคุณสามารถกำหนดสไตล์ในระดับแอปพลิเคชันเพื่อนำไปใช้กับกิจกรรมทั้งหมดของคุณได้ในคราวเดียว ขอบคุณสำหรับรหัสโดยวิธีการ
Eric Kok

2
นี่ไม่ใช่การเปลี่ยนสีพื้นหลังของชื่อสีข้อความเท่านั้นที่จะเปลี่ยนไป แม้ว่าฉันจะเปลี่ยนสีของแถบหัวเรื่อง <color name = "titlebackgroundcolor"> # 3232CD </color> ฉันทำอะไรผิดหรือเปล่า?
Shaista Naaz

18

ขอบคุณสำหรับคำอธิบายที่ชัดเจนนี้อย่างไรก็ตามฉันต้องการเพิ่มอีกเล็กน้อยสำหรับคำตอบของคุณโดยการถามคำถามที่เชื่อมโยง (ไม่ต้องการโพสต์ใหม่เนื่องจากคำถามนี้เป็นชั้นใต้ดินของคำถามของฉัน)

ฉันกำลังประกาศแถบหัวเรื่องของฉันใน Superclass ซึ่งกิจกรรมอื่น ๆ ทั้งหมดของฉันคือเด็ก ๆ ที่จะต้องเปลี่ยนสีของแถบเพียงครั้งเดียว ฉันต้องการเพิ่มไอคอนและเปลี่ยนข้อความในแถบด้วย ฉันได้ทำการทดสอบบางอย่างแล้วและสามารถเปลี่ยนแปลงอย่างใดอย่างหนึ่ง แต่ไม่ใช่ทั้งสองอย่างในเวลาเดียวกัน (โดยใช้ 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);

(คุณต้องประกาศ textview เป็นตัวแปรคลาสที่มีการป้องกัน)

จากนั้นพลังของสิ่งนี้ก็คือทุกที่ในแอปของคุณ (เช่นกิจกรรมทั้งหมดของคุณเป็นเด็ก ๆ ในชั้นเรียนนี้) คุณก็ต้องโทรหา

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 ให้ครับ !!!
RK

@ ทำไมฉันต้องสร้างคลาสอื่นสำหรับแถบหัวเรื่องแล้วฉันจะใช้มันได้เท่านั้น?
Vikas Gupta

มันไม่ทำงานที่นี่stackoverflow.com/questions/31157222/…
Aditya

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 และไม่มีอะไรอยู่ในโค้ด คุณช่วยแนะนำฉันด้วยได้ไหม
Shaista Naaz

ฉันคิดว่าคุณมีทางออกในคำตอบที่เลือกไว้ด้านบน คุณต้องกำหนดธีมที่กำหนดเองสำหรับกิจกรรมและตั้งค่า android: windowTitleBackgroundStyle เป็นสีที่คุณต้องการ
mikeplate

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 Honeycomb) ซึ่งแน่นอนว่าล้าสมัยพอที่จะพิจารณาว่านี่เป็นตัวเลือกที่ถูกต้อง
zgc7009

แต่ฉันยังคงใช้มันในแอปพลิเคชันล่าสุดของฉันกับ targetSdkVersion = "23" โดยไม่ได้รับข้อมูลใด ๆ ที่เลิกใช้งาน
Edwinfad

แน่นอนว่าใช้สิ่งนี้ได้ 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.xmlSDK ดูเหมือนว่าจะกำหนดชื่อเรื่องไว้ที่นั่น คุณสามารถตรวจสอบเค้าโครงเช่นนี้ได้บ่อยครั้งและยืม style="?android:attr/windowTitleStyle" สไตล์ที่คุณสามารถใช้และแทนที่ใน TextView ของคุณเองได้

คุณอาจสามารถเลือกชื่อสำหรับการปรับแต่งโดยตรงได้โดยทำดังนี้

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

1
คำตอบที่ดีข้างต้น แต่เป็นไปได้หรือไม่ที่จะระบายสีแถบชื่อเรื่องโดยไม่ต้องสร้างเค้าโครงที่กำหนดเอง
Eno

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 ดูเหมือนจะคืนค่าว่างให้ฉัน
WORMSS

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 ​​/ colors.xml ของคุณเช่น:

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

)


เมื่อคุณกำหนดเป้าหมายเฉพาะ Android 5 มีทางเลือกอื่นที่ง่ายกว่านั้นโปรดดูที่ [ developer.android.com/training/material/… .
stefan.m

1

สิ่งต่างๆดูเหมือนจะดีขึ้น / ง่ายขึ้นตั้งแต่ 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


1

ฉันทำได้โดยเปลี่ยนค่าสีสไตล์ใน "res" -> "ค่า" -> "colors.xml" ใส่คำอธิบายภาพที่นี่

สิ่งนี้จะเปลี่ยนสีสำหรับทั้งโครงการซึ่งเป็นเรื่องปกติสำหรับฉัน

ใส่คำอธิบายภาพที่นี่



0

วางรหัสนี้หลัง setContentView หรือใน onCreate

หากคุณมีรหัสสีให้ใช้สิ่งนี้

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

หากคุณต้องการรหัสเฉพาะจากไลบรารีสีให้ใช้สิ่งนี้

getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.WHITE));
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.