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


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的原始引用更改为另一个较短的字符串资源。

BUT-大BUT:当然,这也会更改此活动的默认标题!而且我不希望这种情况发生,因为有足够的空间来容纳较长的应用程序名称!再次onCreate使用该setTitle(int)方法设置长标题也无济于事,因为短名称将在短时间内对用户可见,但足以引起注意!

而且-请不要通过引用自定义标题栏来回答我的问题...我不想走那么长的路,仅仅因为一个愚蠢的字符串标题!绘制自定义标题栏效果太差了!

没有简单的方法就这样给发射不同的字符串显示?感谢您的回答!

编辑:拥有自定义标题栏的另一个麻烦是它看起来不会像默认标题栏,我必须明确地做一些事情,以使其在每个设备上看起来都一样!如果毕竟我不想要其他外观,那将不是解决方案!

Answers:


470

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

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

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>

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

添加的信息:标签是从“活动”而不是“应用程序”继承的。

 <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
哎呀,太好了!我今晚会尝试。哇,为什么这样的东西没有正确记录?我知道为什么我不喜欢这些奇怪的XML结构... ;-)
Zordid 2011年

13
哦,不,哦,不。现在很失望。纯Android启动器(在仿真器上!)确实可以完成我们在此讨论的内容,但例如HTC的启动器会忽略意图的标签。!:-(多么愚蠢华硕Eee Pad与蜂窝的确也不能坚持到那个标签。
Zordid

2
那么,您看到的是“活动”标签吗?真可惜 我有一半期望,因为没有对此进行记录,所以任何编写启动器的人都可能不会实现正确的行为。
Mark Renouf

12
适用于我的Gingerbread Nexus One,Nexus S和“较新”版本:-)但可悲的是,由于不一致,我建议不要使用它。我也倾向于通过警告来更新答案。
Mark Renouf

3
我不知道为什么在地球上有这么多的投票。人们是否在假设某项工作正常之前先在真实的设备上测试他们的代码?如其他人所述,该解决方案在实际设备上不起作用。我已经在4种设备(香草和非香草Android)上进行了测试,但是什么也没有。这仅适用于仿真器。我发现的唯一方法是按照Anila的答案中所述使用setTitle。
蒂亚戈

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

到您的主要活动Java文件。


如果您需要在启动器活动上更改标题,则可以正常使用。但是,它会闪烁图标名称大约1秒钟。
rphello101 2012年

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

如果您需要在启动器活动上更改标题,则可以正常使用。

为什么不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>

然后,在MainActivity的onCreate()方法中,设置操作栏的标题:

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

之后,您可以致电:

getActionBar().setDisplayShowTitleEnabled(true);

棘手但值得。


4

这可能无法满足您的要求,但是您是否考虑过创建一个显示非常简短的初始屏幕(具有默认标题),然后使用该setTitle(int)方法以您选择的标题启动新的实际“主”活动?我没有尝试过查看它是否可行,但是这可能会带来令人愉悦的效果,但并不能说明您要实现的目标具有无缝性。



1

我发现了一个办法解决这个问题,

manifest.xml

写你的应用程序的名称android:label中的发射器(主)活动

这将使您的主要活动标签与应用标签相同。

然后,在Launcher(main)活动onCreate()函数中编写以下语句

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

在这里写下您想要给启动器(主)活动的标签。


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
我怀疑这是真的吗:应用程序的标签不是定义启动程序标签的内容-它仅定义如何在已安装的应用程序列表(设置->应用程序->管理应用程序)中命名该应用程序,并且该标签也被Android使用市场也一样。所以我不想改变它。通过实验,我发现启动器也需要该活动的标题。除此之外:您的解决方案涉及我不想要的割礼标题!这根本看起来根本不像默认标题栏-否则我将不得不做很多事情只是为了获得默认行为-一点都不好!
Zordid

嗯...甚至更糟。我刚刚尝试了您的解决方案。但是,标题栏看起来根本不像默认标题栏,更糟糕的是,在自定义标题栏出现之前不久,就会显示默认标题栏(显示我不想看到的短名称)。因此:此解决方案与仅使用设置标题相同setTitle。:-(
Zordid

0

启动器实际上显示android:label和android:icon声明的活动

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

因此应用程序标签没有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.