Android应用程序名称显示为活动名称

28

我已经审查了应用程序的清单,在应用启动器下,它显示为“Activity Name”,而不是应用程序名称?这是为什么。我有另一个应用程序,在安装时,会出现5个条目,每个条目都代表应用程序中的一个活动,而应该只有一个名称,即应用程序的名称?因此,当我要启动它时,启动列表中会有5个完全相同的应用程序名称,它们都以应用程序命名,但每个活动都对应一个应用程序名称。这可能是什么原因?


这似乎很奇怪。我的意思是,为什么Android甚至允许多个具有相同名称的应用程序出现在应用启动列表中? - Androider
1
请粘贴您的清单内容。 - tvkanters
其中一个问题是,对于具有相同名称的多个应用程序来说,启动器类别活动太多了。 - Androider
我认为这解释了我在第二个应用程序中看到的情况。 - Androider
但为什么将Activity名称用作应用程序名称?这是什么原因? - Androider
显示剩余4条评论
6个回答

45
上面被接受的答案是错误的。它说,
android:name属性来自于application标签上的android:label属性。
这是不正确的。以以下代码为例。
<activity android:name="ApiDemos" android:label="@string/app_name">
     <intent-filter>
         <action android:name="android.intent.action.MAIN" />
         <category android:name="android.intent.category.DEFAULT" />
         <category android:name="android.intent.category.LAUNCHER" />
     </intent-filter>
</activity>
在此代码中,显示于启动器中的应用名称由activity标签中的android:label属性设置,而不是上面已接受的答案所说的application标签。
为了纠正上面已接受的回答,启动器图标下方显示的名称来自入口点活动的activity标签中的android:label属性(包含DEFAULTLAUNCHER类别的活动标签),除非您没有在这里指定,否则它会来自application标签上的android:label属性。
您的第一个问题可以通过更改入口点活动标记中的android:label属性来解决。

5
多么奇怪的行为。使用活动名称作为活动,使用应用程序名称作为启动器似乎更合乎逻辑。你认为它现在的工作方式有意义吗? - Luis Mendo
3
这是为了让应用程序开发者可以拥有一个以上的启动器图标(和相关的入口活动)并且能够为每个启动器图标单独命名。您可以通过在清单文件中的多个活动标签中包含以下代码来实现: <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> 并在每个活动标签中添加android:label="@string/app_name" - Patrick
2
@Patrick,如果我只想要一个主活动,那么我该如何为输入活动单独设置标签,与应用程序名称分开呢? - Kareem Elsayed

15

对于第一个问题,你应该注意,在启动Activity时没有标签的情况下,名称来自于在应用程序标记中设置的默认标签android:label属性:

<application android:name="ApiDemosApplication"
   android:label="@string/activity_sample_code"
   android:icon="@drawable/app_sample_code">

如果Activity有标签,那么该标签将被使用。

对于第二个问题,在清单文件中,很可能所有的活动都指定了一个带有动作为android.intent.category.LAUNCHER的意图过滤器。例如:

<activity android:name="ApiDemos">
     <intent-filter>
         <action android:name="android.intent.action.MAIN" />
         <category android:name="android.intent.category.DEFAULT" />
         <category android:name="android.intent.category.LAUNCHER" />
     </intent-filter>
</activity>
如果你在所有活动中都有这样的intent-filter标签,那么你应该将除了你想要在启动时启动的Activity之外的所有intent filter标签都移除掉。如果这个Activity有一个标签,它就是与启动器图标一起显示的标签。
截至2019/01/03,对于API 27+,似乎第一个具有LAUNCHER类别的活动将被启动,并且它的标签将与应用程序图标相关联,因此也许不严格需要删除所有多余的意图过滤器,但我仍然会这样做,因为它可能导致混淆。

1
好的。如果没有标签,它将为主活动选择名称。 - Androider
1
我在上面发布的清单中实际上有一个Android标签吗? - Androider
android:label="@string/app_name" 安卓:标签="@string/app_name" - Androider
LAUNCHER类别是设置当您触摸启动器中的图标时启动的Activity。如果有多个Activity响应Intent(因为类别标签),框架无法确定要启动什么并询问用户。 - Brian Cooley
1
我曾遇到相同的问题,但通过更改具有<action android:name="android.intent.action.MAIN"/>和<category android:name="android.intent.category.LAUNCHER"/>的<Activity/>中的android:name来解决它。 - richy
显示剩余2条评论

8

如果您希望应用程序名称(在应用图标下方显示的名称)与点击应用程序图标时启动的活动的名称不同,则可以在活动的onCreate()方法中显式设置不同的字符串,如下所示:

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  // Do your thing
  // ... bla bla bla

  getActionBar().setTitle(R.string.activity_title);
}

希望这能帮到您!

2
如果您正在使用支持库,请使用getSupportActionBar()而不是getActionBar() - Josselin

2
当您通过Eclipse创建一个Activity时,活动中的属性android:label会自动在AndroidManifest.xml中设置为"@string/your_activity_name"。通过添加意图过滤器来为该活动提供启动器,您的启动器将与活动的android:label相同。
如果您想要使用应用程序名称标记启动器,则应将活动的android:label更改为类似于"@string/app_name"的内容。

1
如果你想在工具栏标题的位置放置一个图片视图,你需要更新 Android 清单中特定活动的标签,如下所示:android:label=""; 这样做后,图片视图后面就不会显示活动名称了。请使用以下代码设置图片视图以及导航图标和无工具栏标题。
try {
    Toolbar  toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    toolbar.setTitle("");
    if (getSupportActionBar() != null)
        getSupportActionBar().setIcon(R.drawable.header_image_wt);
} catch (Exception e) {
    e.getMessage();
}

0
在运行Android 4.1.2版本的情况下,应用程序的名称将是“静态”,与在活动中定义为主启动器并且未在任何意图过滤器中被覆盖的标签相关。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接