我正在使用ActionBar
的标签功能PageViewer
,但遇到了问题。在我的Nexus 7上,标签显示如下:
由于空间不足,您可以看到标题被删除。但是对于Android 4.0的HTC Incredible S,它显示如下:
这就是我想要的。我在factr中希望标签栏放在屏幕的底部,但是分成两行并且都在顶部是可以接受的。
有没有人知道如何在Nexus 7上强制应用也将标签栏拆分到另一行?谢谢!
答案 0 :(得分:15)
AFAIK,单独的操作栏决定是否将标签放在第二行,我们无法影响它。
另外,请记住,在很多情况下,您的标签根本不会显示,而是由下拉列表替换 - 基本上,Android会将标签导航转换为列表导航。
如果您想确保标签始终是标签,并且始终位于操作栏下方,请从操作栏中删除标签,然后使用ViewPager
切换为您的内容{{1} (来自Android支持包,其中PagerTabStrip
来自)或ViewPagerIndicator项目中的标签指示符用于标签本身。作为附带好处,您的内容现在可以横向滑动以在标签之间移动,这是当今流行的方法。
我在factr中希望标签栏放在屏幕底部
请注意,这违反了Android设计准则:http://developer.android.com/design/patterns/pure-android.html
答案 1 :(得分:7)
我用它来强制从Gingerbread到KitKat的ActionBar堆叠或非堆叠标签。
修改自:http://www.blogc.at/2014/01/23/android-tabs-appear-above-or-below-actionbar/
setHasEmbeddedTabs(mActionbar,false);
public static void setHasEmbeddedTabs(Object inActionBar, final boolean inHasEmbeddedTabs)
{
// get the ActionBar class
Class<?> actionBarClass = inActionBar.getClass();
// if it is a Jelly Bean implementation (ActionBarImplJB), get the super class (ActionBarImplICS)
if ("android.support.v7.app.ActionBarImplJB".equals(actionBarClass.getName()))
{
actionBarClass = actionBarClass.getSuperclass();
}
// if Android 4.3 >
if ("android.support.v7.app.ActionBarImplJBMR2".equals(actionBarClass.getName())){
actionBarClass = actionBarClass.getSuperclass().getSuperclass();
}
try
{
// try to get the mActionBar field, because the current ActionBar is probably just a wrapper Class
// if this fails, no worries, this will be an instance of the native ActionBar class or from the ActionBarImplBase class
final Field actionBarField = actionBarClass.getDeclaredField("mActionBar");
actionBarField.setAccessible(true);
inActionBar = actionBarField.get(inActionBar);
actionBarClass = inActionBar.getClass();
}
catch (IllegalAccessException e) {}
catch (IllegalArgumentException e) {}
catch (NoSuchFieldException e) {}
try
{
// now call the method setHasEmbeddedTabs, this will put the tabs inside the ActionBar
// if this fails, you're on you own <img class="wp-smiley" alt=";-)" src="http://www.blogc.at/wp-includes/images/smilies/icon_wink.gif">
final Method method = actionBarClass.getDeclaredMethod("setHasEmbeddedTabs", new Class[] { Boolean.TYPE });
method.setAccessible(true);
method.invoke(inActionBar, new Object[]{ inHasEmbeddedTabs });
}
catch (NoSuchMethodException e) {}
catch (InvocationTargetException e) {}
catch (IllegalAccessException e) {}
catch (IllegalArgumentException e) {}
}
答案 2 :(得分:1)
如果您需要支持手机和平板电脑,并且不想使用单独的实施,您可以将其添加到您的活动中:
@Override
public Resources getResources() {
if (mResourcesImpl == null) {
mResourcesImpl = new ResourcesImpl(super.getResources());
}
return mResourcesImpl;
}
class ResourcesImpl extends Resources {
private Resources mResources;
private Set<Integer> mActionBarEmbedTabsIds = new HashSet<Integer>();
ResourcesImpl(Resources resources) {
super(resources.getAssets(), resources.getDisplayMetrics(), resources.getConfiguration());
mResources = resources;
String packageName = getPackageName();
mActionBarEmbedTabsIds.add(mResources.getIdentifier("abc_action_bar_embed_tabs", "bool", packageName));
mActionBarEmbedTabsIds.add(mResources.getIdentifier("abc_action_bar_embed_tabs_pre_jb", "bool", packageName));
mActionBarEmbedTabsIds.add(mResources.getIdentifier("action_bar_embed_tabs", "bool", "android"));
mActionBarEmbedTabsIds.add(mResources.getIdentifier("action_bar_embed_tabs_pre_jb", "bool", "android"));
mActionBarEmbedTabsIds.remove(0);
}
@Override
public boolean getBoolean(int id) throws NotFoundException {
if (mActionBarEmbedTabsIds.contains(id)) {
return areActionBarTabsEmbed(); // stacked ot embed goes here
}
return super.getBoolean(id);
}
}
答案 3 :(得分:-1)
没有办法,为了避免标签成为微调器,在添加标签后设置导航模式