当android:targetSdkVersion为16时,操作栏的行为是什么?

17
我试图实现一个带选项卡的操作栏作为导航选项。为此,我在“新Android应用程序”向导的“New Blank Activity”部分中选择“Tabs + Swipe”选项,如下图所示。 Tab+Swipe wizard option 现在,在Android清单中,当...
android:targetSdkVersion="15"

如果使用默认值,Nexus 7/Nexus 7模拟器中的操作栏将是这样的,这是应用程序所需的外观

默认行为

现在,当我更改Android清单中的那行为:

android:targetSdkVersion="16"

当 android:targetSdkVersion 版本设置为 16 时,操作栏的外观会发生变化,如下所示:

Behaviour after android:targetSdkVersion="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个回答

14

将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上会使用堆叠布局。至少您将能够设计您的布局并了解预期效果。

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


5
这实际上已经有记录了。在这里:http://developer.android.com/reference/android/os/Build.VERSION_CODES.html#JELLY_BEAN :'新的嵌入式选项卡 ActionBar 策略:在纵向模式下,无论屏幕大小如何,嵌入式选项卡现在始终堆叠在操作栏中。' - Nikolay Elenkov
谢谢,这很有帮助。我可以使用ActionBar Sherlock将其嵌入而不是始终堆叠(像Jellybean之前的默认操作栏行为)吗? - Soham
@Soham 我不这么认为,至少我没有看到过。由于所有新版本的 Android 都将使用 stacked,为什么不直接使用它,这样以后就不用更改了呢? - Geobits
@NikolayElenkov,感谢提供链接。我正在寻找类似的东西以更好地解释它。 - Geobits
3
ABS 在早期的 ICS 版本上表现一致,但在 JB 版本中使用原生的 action bar,因此您应该获得相同的行为。 - Nikolay Elenkov
@Geobits,堆叠版本浪费了一整行的空间,这是不可接受的 :) 让我看看能否调整 ABS 的设置,使其默认嵌入。不过还是谢谢你的建议。 - Soham

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