[英]How to force splitting ActionBar's Tab and Title/Home/Menu?
我正在使用帶有PageViewer
ActionBar
選項卡功能,但遇到了問題。 在我的Nexus 7上,標簽顯示如下:
由於空間不足,您可以看到標題被刪除。 但是對於Android 4.0的HTC Incredible S,它顯示如下:
這就是我想要的。 我在factr中希望標簽欄放在屏幕的底部,但是分成兩行並且兩者都在頂部是可以接受的。
有誰知道如何強制在Nexus 7上的應用程序也拆分標簽欄到另一行? 謝謝!
AFAIK,單獨的操作欄決定是否將標簽放在第二行,我們無法影響它。
此外,請記住,在許多情況下,您的標簽根本不會顯示,而是由下拉列表替換 - 基本上,Android會將標簽導航轉換為列表導航。
如果要確保選項卡始終是選項卡,並且始終位於操作欄下方,請從操作欄中刪除選項卡,然后切換到使用ViewPager
作為內容,使用PagerTabStrip
(來自Android支持包, ViewPager
來自from)或ViewPagerIndicator項目中的標簽指示符,用於標簽本身。 作為附帶好處,您的內容現在可以水平滑動以在標簽之間移動,這是當今流行的方法。
我在factr中希望標簽欄放在屏幕的底部
請記住,這違反了Android設計准則: http : //developer.android.com/design/patterns/pure-android.html
我用這個來強制從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) {}
}
如果您需要支持手機和平板電腦,並且不想使用單獨的實施,您可以將其添加到您的活動中:
@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);
}
}
沒有辦法,在添加選項卡后,避免選項卡成為微調器設置導航模式
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.