簡體   English   中英

如何強制拆分ActionBar的標簽和標題/主頁/菜單?

[英]How to force splitting ActionBar's Tab and Title/Home/Menu?

我正在使用帶有PageViewer ActionBar選項卡功能,但遇到了問題。 在我的Nexus 7上,標簽顯示如下:

在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/

http://i.imgur.com/fO0Vk3V.png

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM