【问题标题】:How to set different label for launcher rather than activity title?如何为启动器设置不同的标签而不是活动标题?
【发布时间】:2011-03-30 03:43:14
【问题描述】:

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

我想给我的应用程序启动器图标(显示在开始屏幕上的那个!)一个不同的、更短的标题。启动器似乎从关于主要活动标签的 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 - big BUT:这当然也改变了这个活动的默认标题!而且我不希望这种情况发生,有足够的空间容纳长应用程序名称!使用setTitle(int) 方法在onCreate 中再次设置长标题也没有好处,因为短名称将在短时间内对用户可见,但足够长以引起注意!

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

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

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

【问题讨论】:

    标签: android label android-manifest titlebar launcher


    【解决方案1】:

    显然&lt;intent-filter&gt; 可以有一个标签属性。如果它不存在,则标签是从父组件(活动或应用程序)继承的。因此,使用它,您可以为启动器图标设置标签,同时仍然让 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>
    

    旁注: 也可以有一个图标属性,但是 莫名其妙 not 覆盖了 活动。如果您打算使用本机,这可能对您很重要 SDK 11+ 中的 ActionBar,它使用指定的 Icon 和 Logo 活动。

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

    【讨论】:

    • 天啊,太好了!!我今晚试试。哇,为什么这样的事情没有正确记录??!我知道为什么我不喜欢这些奇怪的 XML 结构... ;-)
    • 哦不,哦不。现在很失望。纯 Android 启动器(在模拟器上!)确实做了我们在这里讨论的事情,但是例如HTC 的启动器会忽略意图的标签标签。 :-( 多么愚蠢!Asus Eee Pad with Honeycomb 也不符合那个标签。
    • 那么您看到的是活动标签吗?真可惜。我有一半的预期是,由于没有记录,任何编写启动器的人都可能不会实现正确的行为。
    • 适用于我的 Gingerbread Nexus One、Nexus S 以及“更新”版本 :-) 但遗憾的是,由于不一致,我建议不要使用它。我也倾向于用警告更新答案。
    • 我不知道为什么这有这么多的赞成票。在假设某些东西正常工作之前,人们不会先在真实设备上测试他们的代码吗?正如其他人所说,此解决方案不适用于真实设备。我已经在 4 台设备(香草和非香草 Android)上进行了测试,但什么也没有。这仅适用于模拟器。我发现的唯一方法是按照 Anila 的回答中所述使用 setTitle。
    【解决方案2】:

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

    <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 秒钟。
    • 如果您不介意您的应用短暂地显示一个空白操作栏(即根本没有标题),那么您可以更改您的操作栏样式并从displayOptions 中删除showTitle。然后您可以像这样在活动onCreate 中打开标题: this.getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE);这比图标名称闪烁要好,但这确实意味着应用程序中的每个活动都必须在需要时打开标题。
    • 如果您需要更改启动器 Activity 的标题,此方法可以正常工作。
    • 为什么不setTitle(R.string.app_name);
    【解决方案3】:

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

    棘手但值得。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        对于通过setSupportActionBar() 方法使用Support / Appcompat工具栏的任何人,可以在工具栏 XML 中设置活动标题:

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

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

        android.support.v7.widget.Toolbar

        【讨论】:

          【解决方案6】:

          我找到了解决此问题的方法

          manifest.xml

          launcher(main) 活动android:label 中写下您的应用名称

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

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

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

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

          【讨论】:

            【解决方案7】:

            你可以这样做:

            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 文件中,您只需设置应用程序的标题,该标题将显示在启动器图标中。对于您的活动,您无需在此处设置标题。

            【讨论】:

            • 我怀疑这是真的:应用程序的标签不是定义启动器标签的东西 - 它仅定义应用程序在已安装应用程序列表中的命名方式(设置 - >applications->manage applications),这个标签也被 Android Market 采用。所以我不想改变这一点。通过实验,我发现启动器也采用了活动的标题。除此之外:您的解决方案涉及我不想要的cutsom标题!这根本不像默认的标题栏——否则我必须做很多事情才能获得默认行为——一点都不好!
            • 嗯...更糟糕的是。我刚试过你的解决方案。但是,标题栏看起来根本不像默认标题栏,更糟糕的是,默认标题栏(显示我不想看到的短名称)在自定义标题栏出现之前不久显示。因此:此解决方案与仅使用 setTitle 设置标题相同。 :-(
            【解决方案8】:

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

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

            所以应用标签没有用。

            【讨论】:

              猜你喜欢
              • 2017-03-02
              • 1970-01-01
              • 1970-01-01
              • 2022-12-01
              • 2012-01-25
              • 1970-01-01
              • 1970-01-01
              • 2020-02-17
              • 1970-01-01
              相关资源
              最近更新 更多