274

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

我想给我的应用程序启动器图标(显示在开始屏幕上的那个!)一个不同的、更短的标题。启动器似乎从关于主要活动标签的 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)也没有好处,因为短名称将在短时间内对用户可见,但足够长才能注意到!

而且 - 请不要通过引用自定义标题栏来回答我的问题......我不想走那么远,只是因为一个愚蠢的字符串标题!画一个自定义标题栏效果太差了,太痛苦了!

没有简单的方法可以让启动器显示一个不同的字符串?感谢您的回答!

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

4

8 回答 8

472

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

旁注:<intent-filter>也可以有一个icon属性,但是莫名其妙的并没有覆盖Activity中指定的icon。如果您计划在 SDK 11+ 中使用本机 ActionBar,这对您可能很重要,它使用 Activity 上指定的图标和徽标。

添加信息:标签是从 Activity 继承的,而不是从应用程序继承的。

 <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 将显示启动器图标,如果我们没有像上面提到的那样把标签放在里面。

于 2011-08-30T23:23:33.153 回答
36

我一直在寻找同样的东西,这对我有用。

<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 文件。

于 2012-04-05T10:28:49.923 回答
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() 方法中,设置 Action Bar 的标题:

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

之后,您可以调用:

getActionBar().setDisplayShowTitleEnabled(true);

棘手但值得。

于 2014-04-28T08:27:49.077 回答
4

这可能无法满足您想要做的事情,但是您是否考虑过创建一个显示非常简短的初始屏幕(使用默认标题),然后使用您选择的标题启动新的实际“主”setTitle(int)活动? 我没有尝试过这个,看看它是否有效,但这可能会创造一个令人愉快的工作,它不会显示你想要实现的目标的无缝性。

于 2010-08-25T10:41:43.647 回答
3

对于通过该方法使用Support / Appcompat Toolbar 的任何人setSupportActionBar(),可以在 Toolbar XML 中设置 Activity 标题:

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

这将覆盖清单中设置的应用程序和活动标签。

android.support.v7.widget.Toolbar

于 2017-12-02T21:53:39.530 回答
1



我在Launcher(main) activitymanifest.xml

Write your app's name找到了解决此问题的方法。 这将使您的主要活动的标签与应用程序标签的标签相同。 然后,在您的Launcher(main) 活动的函数中编写此语句android:label



onCreate()

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

在这里写下你想给你的 Launcher(main) 活动的标签。

于 2017-08-12T13:32:45.777 回答
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文件中,您只需设置应用程序的标题,这将在启动器图标中显示。对于您的活动,您不需要在那里设置标题。

于 2010-08-15T18:48:39.713 回答
0

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

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

所以应用标签是没有用的。

于 2017-09-29T11:05:13.807 回答