วิธีตั้งค่าป้ายกำกับที่แตกต่างกันสำหรับตัวเรียกใช้งานแทนที่จะเป็นชื่อกิจกรรม


269

คำถามนี้ถูกถามมาก่อน - แต่ไม่มีคำตอบที่น่าพอใจเลย! ดังนั้นฉันจะลองอีกครั้ง

ฉันต้องการให้ไอคอนตัวเรียกใช้งานแอปพลิเคชันของฉัน (ไอคอนที่ปรากฏบนหน้าจอเริ่มต้น!) คำอธิบายภาพที่สั้นกว่าและแตกต่างกัน ดูเหมือนว่าตัวเรียกใช้จะใช้เลเบลจากส่วน mainfest เกี่ยวกับเลเบลของกิจกรรมหลักดังที่นี่:

<activity android:name="MainActivity" android:label="@string/app_short_name">
<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

ฉันได้เปลี่ยนการอ้างอิงดั้งเดิมเป็นชื่อแอป @ string / app_name ของฉันไปเป็นทรัพยากรสตริงที่สั้นกว่าเดิมที่นี่

แต่ - ใหญ่แต่แน่นอนว่าสิ่งนี้จะเปลี่ยนชื่อเริ่มต้นของกิจกรรมนี้ด้วย! และฉันไม่ต้องการที่จะเกิดขึ้นมีพื้นที่เพียงพอสำหรับชื่อแอปพลิเคชันที่ยาว! การตั้งชื่อแบบยาวอีกครั้งในการonCreateใช้setTitle(int)วิธีการนั้นไม่ดีเช่นกันเนื่องจากชื่อย่อจะปรากฏแก่ผู้ใช้ในช่วงเวลาสั้น ๆ แต่นานพอที่จะสังเกตเห็น!

และ - โปรดอย่าตอบคำถามของฉันโดยอ้างถึงแถบหัวเรื่องที่กำหนดเอง ... ฉันไม่ต้องการที่จะไปทางยาวเพียงเพราะชื่อสตริงโง่! เป็นเรื่องยากที่จะวาดแถบหัวเรื่องที่กำหนดเองเพื่อเอฟเฟกต์เล็ก ๆ น้อย ๆ !

มีไม่มีวิธีง่ายๆเพียงแค่ให้ปล่อยสตริงที่แตกต่างกันในการแสดงผล? ขอบคุณสำหรับคำตอบ!

แก้ไข:อีกเหตุผลหนึ่งว่าทำไมการมีแถบหัวเรื่องที่กำหนดเองคือความเจ็บปวดคือมันจะไม่ดูเหมือนกับแถบหัวเรื่องเริ่มต้นฉันจะต้องทำสิ่งต่าง ๆ เพื่อให้มันดูเหมือนกันในแต่ละอุปกรณ์! และนั่นก็ไม่สามารถแก้ปัญหาได้หากหลังจากทั้งหมดฉันไม่ต้องการมีลักษณะที่แตกต่าง!

คำตอบ:


470

เห็นได้ชัดว่า<intent-filter>สามารถมีแอตทริบิวต์ป้ายกำกับ หากไม่มีฉลากจะได้รับมาจากองค์ประกอบหลัก (กิจกรรมหรือแอปพลิเคชัน) ดังนั้นเมื่อใช้สิ่งนี้คุณสามารถกำหนดป้ายกำกับสำหรับไอคอนตัวเรียกใช้ในขณะที่ยังคงมีกิจกรรมที่มีชื่อเป็นของตัวเอง

โปรดทราบว่าในขณะที่การทำงานกับ emulators มันอาจไม่ทำงานบนอุปกรณ์จริงเพราะมันขึ้นอยู่กับการใช้งานตัวเรียกใช้งานที่ใช้

http://developer.android.com/guide/topics/manifest/intent-filter-element.html

<activity
  android:name=".ui.HomeActivity"
  android:label="@string/title_home_activity"
  android:icon="@drawable/icon">
  <intent-filter android:label="@string/app_name">
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
</activity>

หมายเหตุด้านข้าง: <intent-filter> สามารถมีแอตทริบิวต์ icon ได้ แต่ไม่สามารถลบล้างไอคอนที่ระบุในกิจกรรมได้ สิ่งนี้อาจมีความสำคัญสำหรับคุณหากคุณวางแผนที่จะใช้ ActionBar ดั้งเดิมใน SDK 11+ ซึ่งใช้ไอคอนและโลโก้ที่ระบุในกิจกรรม

ข้อมูลที่เพิ่มเข้ามา:ฉลากกำลังถูกสืบทอดจากกิจกรรมไม่ใช่แอปพลิเคชัน

 <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"       
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <activity
            android:name=".StartActivity"
            android:label="@string/app_long_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

ในกรณีนี้ app_long_name จะแสดงพร้อมไอคอนตัวเรียกใช้งานหากเราไม่ใส่ป้ายกำกับไว้ตามที่กล่าวไว้ข้างต้น


5
Gee นั่นยอดเยี่ยม !! ฉันจะลองคืนนี้ ว้าวทำไมเรื่องแบบนี้ถึงไม่ได้บันทึกไว้อย่างถูกต้อง ?? !! ฉันรู้ว่าทำไมฉันไม่ชอบโครงสร้าง XML แปลก ๆ เหล่านี้ ... ;-)
Zordid

13
โอ้ไม่โอไม่ ผิดหวังตอนนี้ ตัวเรียกใช้งาน Android บริสุทธิ์ (บนตัวเลียนแบบ!) ทำสิ่งที่เราพูดถึงที่นี่จริง ๆ แต่เช่นตัวเรียกใช้งานของ HTC จะละเว้นแท็กป้ายกำกับของเจตนา :-( ช่างโง่
เหลือเกิน

2
ดังนั้นสิ่งที่คุณเห็นคือป้ายกำกับกิจกรรม นั่นเป็นความอัปยศ ฉันคาดหวังครึ่งหนึ่งว่าเนื่องจากสิ่งนี้ไม่ได้รับการบันทึกไว้ใครก็ตามที่เขียนตัวเรียกใช้งานอาจไม่สามารถใช้งานได้อย่างถูกต้อง
Mark Renouf

12
ใช้งานได้กับ Gingerbread Nexus One, Nexus S รวมถึงรุ่นใหม่กว่า :-) แต่น่าเสียดายนะเพื่อนที่ไม่สอดคล้องกันฉันไม่แนะนำให้ใช้ ฉันมีแนวโน้มที่จะปรับปรุงคำตอบด้วยคำเตือนเช่นกัน
Mark Renouf

3
ฉันไม่รู้ว่าทำไมบนโลกนี้มี upvotes มากมาย ผู้คนไม่ทดสอบรหัสของพวกเขาบนอุปกรณ์จริงก่อนที่จะสมมติว่ามีบางอย่างใช้งานได้ วิธีการแก้ปัญหานี้ตามที่ระบุไว้โดยคนอื่นไม่ทำงานบนอุปกรณ์จริง ฉันทำการทดสอบใน 4 อุปกรณ์ (Android และ Vanilla ไม่ใช่ Android) และไม่มีอะไร ใช้งานได้กับเครื่องจำลองเท่านั้น วิธีเดียวที่ฉันพบคือใช้ setTitle ตามที่อธิบายไว้ในคำตอบของ Anila
Tiago

35

ฉันกำลังมองหาสิ่งเดียวกันและนี่คือสิ่งที่ได้ผลสำหรับฉัน

<activity android:name="MainActivity" android:label="@string/app_short_name">
<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

นี่จะให้ชื่อย่อกับไอคอนตัวเรียกใช้งานแอปพลิเคชันของคุณ

หากต้องการเพิ่มชื่อที่ใหญ่ขึ้นในแถบแอปพลิเคชันคุณต้องเพิ่ม:

this.setTitle(getResources().getString(R.string.app_name));

ลงในไฟล์กิจกรรมหลักของคุณ


สิ่งนี้ใช้ได้โดยไม่ล้มเหลวหากคุณต้องการเปลี่ยนชื่อเรื่องในกิจกรรมตัวเรียกใช้งานของคุณ อย่างไรก็ตามจะกะพริบชื่อไอคอนเป็นเวลาประมาณ 1 วินาที
rphello101

2
หากคุณไม่ทราบ app ของคุณแสดงในเวลาสั้น ๆ actionbar ว่างเปล่า (เช่นชื่อที่ไม่ทั้งหมด) แล้วคุณสามารถเปลี่ยนลักษณะ actionbar ของคุณและลบจากshowTitle displayOptionsจากนั้นคุณสามารถเปิดหัวเรื่องในกิจกรรมonCreateดังนี้: this.getActionBar () setDisplayOptions (ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE); สิ่งนี้ดีกว่าชื่อไอคอนที่กระพริบ แต่หมายความว่าทุกกิจกรรมในแอปพลิเคชันของคุณจะต้องเปิดใช้ชื่อหากจำเป็นต้องใช้
BruceHill

สิ่งนี้ใช้ได้โดยไม่ล้มเหลวหากคุณต้องการเปลี่ยนชื่อเรื่องในกิจกรรมตัวเรียกใช้งานของคุณ

ทำไมsetTitle(R.string.app_name);ล่ะ
arekolek

10

โซลูชันของ Mark Renouf ไม่สามารถใช้งานได้ (ใช้ Nexus 4 และ Android 4.4) มันล้มเหลวเมื่อใช้ทางลัดทางลัดใช้ป้ายกำกับกิจกรรมหลักแทนชื่อแอป ฉันเห็นแอพบางตัวเช่น GMail และ Google Keep ที่ใช้งานได้ดี แต่เมื่อคุณเปิดพวกเขาฉันสังเกตเห็นว่าช่วงเวลาระหว่างชื่อเรื่องว่างเปล่าและชื่อปรากฏขึ้น (ซึ่งดูเหมือนจะดีกว่าชื่อแอพที่กระพริบก่อนที่จะตั้งชื่อโดยใช้ setTitle ())

ดังนั้นนี่คือทางออกที่ดีที่สุดที่ฉันพบ :

สร้างสไตล์ที่ ActionBar ไม่แสดงชื่อ / เลเบล:

<style name="NoActionBarTitle" parent="android:Theme.Holo.Light.DarkActionBar">
    <item name="android:actionBarStyle">@style/NoActionBarTitle.ActionBar</item>
</style>

<style name="NoActionBarTitle.ActionBar" parent="@android:style/Widget.Holo.ActionBar">
    <item name="android:displayOptions">showHome|useLogo</item>
</style>

ฉันใช้ลิ้นชักการนำทางและใช้โลโก้ (เพราะฉันใช้โลโก้และไอคอนสำหรับแอปของฉัน) คุณสามารถใช้สิ่งที่ แต่ไม่ได้ใช้ showTitle จากนั้นใน AndroidManifest.xml ให้ตั้งค่าธีมสำหรับ MainActivity:

<activity
    android:name="com.xx.xxx.MainActivity"
    android:logo="@drawable/ic_icon_padding"
    android:theme="@style/NoActionBarTitle">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

จากนั้นในเมธอด onCreate () ของ MainActivity ตั้งชื่อของแถบการกระทำของคุณ:

getActionBar().setTitle(R.string.your_title);

หลังจากนั้นคุณสามารถโทร:

getActionBar().setDisplayShowTitleEnabled(true);

ยุ่งยาก แต่ก็คุ้มค่า


4

สิ่งนี้อาจจะไม่เป็นไปตามที่คุณต้องการ แต่มีความคิดเกี่ยวกับการสร้างหน้าจอสแปลชที่แสดงสั้น ๆ (พร้อมชื่อเริ่มต้น) จากนั้นเปิดตัวกิจกรรม "หลัก" ใหม่ที่เกิดขึ้นจริงพร้อมชื่อเรื่องที่คุณเลือกโดยใช้setTitle(int)วิธีการ ? ฉันไม่ได้ลองสิ่งนี้เพื่อดูว่ามันใช้งานได้หรือไม่ แต่อาจสร้างงานที่น่าพอใจซึ่งไม่ได้แสดงให้เห็นถึงธรรมชาติที่ไร้รอยต่อของสิ่งที่คุณพยายามจะทำ


2

สำหรับทุกคนที่ใช้Support / Appcompat Toolbar ผ่านsetSupportActionBar()วิธีการสามารถตั้งชื่อกิจกรรมใน Toolbar XML:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    app:title="@string/activity_title"
    ...
/>

สิ่งนี้จะแทนที่ป้ายกำกับแอปพลิเคชันและกิจกรรมที่กำหนดในรายการ

android.support.v7.widget.Toolbar


1

ผมพบว่าวิธีแก้ปัญหาสำหรับปัญหานี้

ในการmanifest.xml

เขียนของคุณชื่อของแอปในandroid:labelการปล่อย (หลัก) กิจกรรม

วิธีนี้จะทำให้ป้ายกำกับของกิจกรรมหลักของคุณเหมือนกับป้ายกำกับของแอป

จากนั้นในการonCreate()ทำงานของกิจกรรมLauncherของคุณ(หลัก) ให้เขียนคำสั่งนี้

if (getSupportActionBar() != null) {
            getSupportActionBar().setTitle("main activity label");
        }

ที่นี่เขียนป้ายกำกับที่คุณต้องการมอบให้กับกิจกรรม Launcher ของคุณ (หลัก)


0

คุณสามารถทำสิ่งนี้:

public class FooBar extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // change title
        requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
        setContentView(R.layout.main);
        getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.my_title);
    }
}

คุณจะต้องสร้างเค้าโครงที่กำหนดเองเพื่อเก็บชื่อ มันอาจจะง่ายเหมือน (เรียกmy_title.xmlในกรณีนี้):

<?xml version="1.0" encoding="utf-8"?>
<TextView
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="foo bar"/>

ในAndroidManifest.xmlไฟล์ของคุณคุณต้องตั้งชื่อสำหรับแอพซึ่งเป็นสิ่งที่จะแสดงในไอคอนตัวเรียกใช้ สำหรับกิจกรรมของคุณคุณไม่จำเป็นต้องตั้งชื่อ


1
ฉันสงสัยว่าเป็นเรื่องจริง: ป้ายกำกับของแอปพลิเคชันไม่ใช่สิ่งที่กำหนดป้ายตัวเรียกใช้ - เพียงกำหนดว่าแอปพลิเคชันนั้นมีชื่ออย่างไรในรายการแอปที่ติดตั้ง (การตั้งค่า> แอปพลิเคชัน> จัดการแอปพลิเคชัน) ตลาดอีกด้วย ดังนั้นฉันไม่ต้องการเปลี่ยนแปลงสิ่งนั้น จากการทดลองพบว่ามันเป็นชื่อของกิจกรรมที่ตัวเรียกใช้ใช้เช่นกัน นอกเหนือจากนั้น: วิธีการแก้ปัญหาของคุณเกี่ยวข้องกับชื่อ cutom ที่ฉันไม่ต้องการ! สิ่งนี้ไม่เคยดูเหมือนแถบชื่อเริ่มต้นเลย - หรือฉันต้องทำหลายอย่างเพื่อให้ได้พฤติกรรมเริ่มต้น - ไม่ดีเลย!
Zordid

อืม ... มันยิ่งแย่กว่านี้ ฉันเพิ่งลองวิธีแก้ปัญหาของคุณ แต่แถบชื่อเรื่องดูไม่เหมือนค่าเริ่มต้นเลยและยิ่งกว่านั้นแถบหัวเรื่องเริ่มต้น (แสดงชื่อสั้น ๆ ที่ฉันไม่ต้องการเห็น) จะปรากฏขึ้นเร็ว ๆ นี้ก่อนที่แถบหัวเรื่องที่กำหนดเองจะปรากฏขึ้น ดังนั้น: setTitleการแก้ปัญหานี้เป็นเช่นเดียวกับการตั้งค่าเพียงชื่อที่ใช้ :-(
Zordid

0

ตัวเรียกใช้งานแสดง Android: label และ android: ไอคอนสำหรับกิจกรรม (IES) ที่ประกาศ

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

ดังนั้นฉลากแอปพลิเคชันจึงไม่มีประโยชน์

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