android:targetSdkVersion为16时的操作栏行为
我正在尝试实现一个带有选项卡的操作栏作为导航选项。为此,我在“新建Android应用程序”向导的“新建空白活动”部分选择“选项卡+滑动”选项,如下所示 现在,在android清单中,当android:targetSdkVersion为16时的操作栏行为,android,android-layout,android-manifest,android-actionbar,android-4.2-jelly-bean,Android,Android Layout,Android Manifest,Android Actionbar,Android 4.2 Jelly Bean,我正在尝试实现一个带有选项卡的操作栏作为导航选项。为此,我在“新建Android应用程序”向导的“新建空白活动”部分选择“选项卡+滑动”选项,如下所示 现在,在android清单中,当 android:targetSdkVersion="15" 这是默认值,在Nexus 7/Nexus 7模拟器上,操作栏看起来像这样,这是应用程序所需的外观 现在,当我将android清单中的这一行更改为 android:targetSdkVersion="16" 操作栏的外观将更改为 除了16之外,a
android:targetSdkVersion="15"
这是默认值,在Nexus 7/Nexus 7模拟器上,操作栏看起来像这样,这是应用程序所需的外观
现在,当我将android清单中的这一行更改为
android:targetSdkVersion="16"
操作栏的外观将更改为
除了16之外,android的任何版本都保留默认外观,有人能解释一下为什么当targetSdkVersion设置为16时,操作栏的外观会突然改变吗
上述内容在模拟器以及真实的Nexus7上都是可复制的
完整的屏幕抓图
正常:
在android:targetSdkVersion=“16”之后:
更新-2013年3月10日:切换到列表导航模式(而不是标签)以启用移动到android:targetSdkVersion=17将targetSDK设置为16时,它之所以会更改,是因为谷歌改变了标签在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);
}
然而,我怀疑你不只是想要一个原因,而是一个解决方案。不幸的是,我不能给你一个简单的方法来设置它只嵌入
不过,我可以建议使用,使其保持一致。这样做的好处是能够在旧设备上使用actionbars。在使用它(肖像)时,我可以确认,如果将targetSDK设置为16,它将在果冻豆、冰淇淋三明治、姜饼和Froyo上使用堆叠布局。至少你能够设计你的布局,同时知道你想要什么
请记住,在大多数情况下,切换到横向模式会再次将它们嵌入到操作栏中,因为它的测量方式有“足够的空间”。这实际上是有记录的。此处::“嵌入式选项卡的新ActionBar策略:在纵向模式下,无论屏幕大小,嵌入式选项卡现在始终堆叠在操作栏中。”谢谢,这很有帮助,我可以使用ActionBar sherlock使其始终嵌入而不是堆叠(如pre-Jellybean默认的操作栏行为)?@Soham我不这么认为,至少我没见过。既然所有较新版本的Android都将使用stacked,为什么不直接使用它,这样以后就不必更改它了?@NikolayElenkov感谢链接。我一直在寻找类似的东西来更好地解释它。ABS在ICS之前的版本上是一致的,但是在JB上它使用本机操作栏,所以你应该得到相同的行为。