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

时间:2012-10-14 14:41:35

标签: android android-layout android-manifest android-actionbar android-4.2-jelly-bean

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

Tab+Swipe wizard option

现在,在android清单中,何时

android:targetSdkVersion="15"

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

Default behavior

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

android:targetSdkVersion="16"

操作栏的外观更改为此

Behaviour after android:targetSdkVersion="16"

默认外观对于任何版本的android都是16但是,任何人都可以解释为什么当targetSdkVersion设置为16时,操作栏的外观会突然改变吗?

以上内容可在仿真器和真实连接7中重现。

全屏抓取

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

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

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

1 个答案:

答案 0 :(得分: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上的堆叠布局。至少你可以设计你的布局,同时知道会发生什么。

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