如何为启动器而不是活动标题设置不同的标签?

Zor*_*did 265 android label titlebar launcher android-manifest

之前已经问过这个问题 - 但根本没有令人满意的答案!所以我再试一次.

我想给我的应用程序启动器图标(在开始屏幕上显示的图标!)一个不同的,更短的标题.似乎发射器从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>
Run Code Online (Sandbox Code Playgroud)

我已将此应用程序名称@ string/app_name的原始引用更改为其他更短的字符串资源.

但是 - 大但是:这当然也改变了这个活动的默认标题!而且我不希望这种情况发生,有足够的空间来申请长名称!onCreate使用该setTitle(int)方法再次设置长标题也没有用,因为短名称将在短时间内对用户可见,但需要足够长的时间才能注意到!

并且 - 请不要通过引用自定义标题栏来回答我的问题...我不想走那么长的路,只是因为一个愚蠢的字符串标题!绘制一个自定义标题栏以获得如此小的效果是一件痛苦的事!

没有简单的方法只是给启动器一个不同的字符串来显示?谢谢你的回答!

编辑:拥有自定义标题栏的另一个原因是它看起来不像默认的标题栏,我必须明确地做一些事情,使它在每个设备上看起来都很相似!如果毕竟我不想要一个不同的外观,这不可能是一个解决方案!

Mar*_*ouf 468

显然<intent-filter>可以有一个label属性.如果不存在,则标签继承自父组件(活动或应用程序).因此,使用此功能,您可以为启动器图标设置标签,同时仍然拥有带有自己标题的活动.

请注意,虽然这适用于模拟器,但它可能无法在实际设备上运行,因为它取决于所使用的启动器实现.

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>
Run Code Online (Sandbox Code Playgroud)

侧注意:<意图滤波器>也可以具有图标属性,但它莫名其妙地并没有覆盖在活动中指定的图标.如果您计划使用SDK 11+中的本机ActionBar,它可能对您很重要,它使用活动上指定的Icon和Logo.

添加信息:标签是从Activity而不是Application继承的.

 <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>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果我们没有像上面提到的那样放置标签,app_long_name将显示启动器图标.

  • 哦不,哦不.现在很失望.纯Android启动器(在模拟器上!)确实做了我们在这里讨论的内容,但是例如HTC的启动器忽略了intent的标签标签.:-(多么愚蠢!华硕Eee Pad with Honeycomb也不坚持这个标签. (12认同)
  • 不适用于Lollipop Nexus 4和Nexus 5. (12认同)
  • 适用于我的Gingerbread Nexus One,Nexus S以及"更新"版本:-)但遗憾的是,我不建议不要使用这个.我也倾向于用警告更新答案. (11认同)
  • 哎呀,真棒!我今晚会试试.哇,为什么这样的事情没有妥善记录?!! 我知道为什么我不喜欢这些奇怪的XML结构... ;-) (5认同)
  • 不适用于Nexus 4 Android Lollipop! (3认同)
  • 我不知道为什么它有这么多的赞成.在假设某些工作正常之前,人们是否首先在真实设备上测试他们的代码?如其他人所述,此解决方案不适用于真实设备.我已经测试了4种设备(香草和非香草Android),什么都没有.这仅适用于模拟器.我找到的唯一方法是按照Anila的回答所述使用setTitle. (3认同)
  • 那么你所看到的是活动标签?真是太遗憾了.我有一半期望,因为没有记录,所以编写启动器的任何人都可能无法实现正确的行为. (2认同)
  • 在Lollipop中也不适合我,看起来如果设置的启动器活动标签将始终优先于intent-filter标签. (2认同)

Ani*_*ila 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>
Run Code Online (Sandbox Code Playgroud)

这将为您的应用程序启动器图标提供一个简短的名称.

要向应用程序栏添加更大的名称,您只需添加:

this.setTitle(getResources().getString(R.string.app_name));
Run Code Online (Sandbox Code Playgroud)

到你的主要活动java文件.

  • 如果您不介意您的应用程序短暂显示空白操作栏(即根本没有标题),那么您可以更改操作栏样式并从`displayOptions`中删除`showTitle`.然后你可以在活动`onCreate`中打开标题,如下所示:this.getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE); 这比图标名称闪烁要好,但它确实意味着应用程序中的每个活动都必须在需要时打开标题. (2认同)

Fer*_*gre 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>
Run Code Online (Sandbox Code Playgroud)

我正在使用导航抽屉并使用徽标(因为我的应用程序使用徽标和图标).您可以使用任何但不使用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>
Run Code Online (Sandbox Code Playgroud)

然后,在MainActivity的onCreate()方法中,设置Action Bar的标题:

getActionBar().setTitle(R.string.your_title);
Run Code Online (Sandbox Code Playgroud)

之后,您可以致电:

getActionBar().setDisplayShowTitleEnabled(true);
Run Code Online (Sandbox Code Playgroud)

棘手但值得.