android:targetSdkVersion 为 16 时的操作栏行为

Posted

技术标签:

【中文标题】android:targetSdkVersion 为 16 时的操作栏行为【英文标题】:action bar behavior when android:targetSdkVersion is 16 【发布时间】:2012-10-04 16:43:44 【问题描述】:

我正在尝试使用选项卡作为导航选项来实现操作栏。为此,我在“New android App”向导的“New Blank Activity”部分选择“Tabs+Swipe”选项,如下所示。

现在,在 android 清单中,当

android:targetSdkVersion="15"

这是默认值,操作栏在 Nexus 7/Nexus 7 模拟器上看起来像这样,这是应用所需的外观

现在,当我将 android 清单中的那一行更改为

android:targetSdkVersion="16"

操作栏的外观变成了这个

除了 16 之外的任何版本的 android 都保留默认外观,谁能解释一下为什么当 targetSdkVersion 设置为 16 时操作栏的外观会突然改变?

以上内容可以在模拟器和真正的 nexus 7 上重现。

全屏截图

正常: http://i.stack.imgur.com/VsBA2.png

在 android:targetSdkVersion="16" 之后: http://i.stack.imgur.com/OM6Y4.png

2013 年 3 月 10 日更新:切换到列表导航模式(而不是选项卡)以启用移动到 android:targetSdkVersion=17

【问题讨论】:

【参考方案1】:

将 targetSDK 设置为 16 时发生更改的原因是因为 Google 更改了 Jelly Bean 中标签的测量方式。具体来说,请看android.internal.view.ActionBarPolicy

public boolean hasEmbeddedTabs() 
    final int targetSdk = mContext.getApplicationInfo().targetSdkVersion;
    if (targetSdk >= Build.VERSION_CODES.JELLY_BEAN) 
        return mContext.getResources().getBoolean(R.bool.action_bar_embed_tabs);
    

    // The embedded tabs policy changed in Jellybean; give older apps the old policy
    // so they get what they expect.
    return mContext.getResources().getBoolean(R.bool.action_bar_embed_tabs_pre_jb);

但是,我怀疑您不仅想要原因,还想要解决方案。不幸的是,我不能给你一个简单的方法来将它设置为仅嵌入。

可以建议使用ActionBarSherlock 使其一致。这样做的好处是能够在旧设备上使用操作栏。使用它时(纵向),我可以确认如果您将 targetSDK 设置为 16,它使用 Jelly Bean、Ice Cream Sandwich、GingerBread 和 Froyo 上的堆叠布局。至少您可以在设计布局的同时知道会发生什么。

请记住,在大多数情况下,切换到横向模式会将它们再次嵌入到操作栏中,因为它的测量方式有“足够的空间”。

【讨论】:

这实际上是有记录的。此处:developer.android.com/reference/android/os/…:'嵌入式选项卡的新 ActionBar 策略:无论屏幕大小如何,嵌入式选项卡现在始终堆叠在操作栏中,在纵向模式下。' 谢谢,这有帮助,我可以一直使用 ActionBar sherlock 使其嵌入而不是堆叠(如 Jellybean 之前的默认操作栏行为)吗? @Soham 我不这么认为,或者至少我没有看到。既然所有较新版本的 Android 都将使用堆叠,为什么不直接使用它,这样您以后就不必更改它了? @NikolayElenkov 感谢您的链接。我一直在寻找类似的东西来更好地解释它。 ABS 在 ICS 之前的版本上是一致的,但是在 JB 上它使用本机操作栏,所以你应该得到相同的行为。

以上是关于android:targetSdkVersion 为 16 时的操作栏行为的主要内容,如果未能解决你的问题,请参考以下文章

android:targetSdkVersion更新引发的“惨案”

android:targetSdkVersion 为 16 时的操作栏行为

android应用系统权限问题

解决启动Eclipse后提示’Running android lint’错误的问题

如何在启动阶段设置状态栏的背景颜色[重复]

Android截图截取弹框AlertDialog