17

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

Tab+滑动向导选项

现在,在 android manifest 中,当

android:targetSdkVersion="15"

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

默认行为

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

android:targetSdkVersion="16"

操作栏的外观变成了这个

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

4

1 回答 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 上的堆叠布局。至少你将能够设计你的布局,同时知道会发生什么。

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

于 2012-10-17T21:51:37.853 回答