5

ActionBarのタブ機能を で使用していますPageViewerが、問題が発生しました。私の Nexus 7 では、タブは次のように表示されます。

Nexus 7 の場合

スペースが不足しているため、タイトルがカットされていることがわかります。しかし、Android 4.0 を搭載した HTC Incredible S では、次のように表示されます。

ここに画像の説明を入力

そして、これが私が欲しいものです。実際には、タブバーを画面の下部に配置したいのですが、2行に分割して両方を上部に配置することは許容されます。

Nexus 7でアプリを強制的にタブバーを別の行に分割する方法を知っている人はいますか? ありがとうございました!

4

4 に答える 4

15

知る限り、アクション バーだけがタブを 2 行目に配置するかどうかを決定しますが、それには影響を与えることはできません。

また、多くの場合、タブがまったく表示されず、ドロップダウン リストに置き換えられることに注意してください。基本的に、Android はタブ ナビゲーションをリスト ナビゲーションに変換します。

タブが常にタブであり、常にアクション バーの下にあることを確認したい場合は、アクション バーからタブを削除しViewPager、コンテンツにを使用するように切り替えますPagerTabStrip。タブ自体のViewPagerIndicatorプロジェクトViewPagerからのタブ インジケーター。副次的な利点として、コンテンツを水平方向にスワイプしてタブ間を移動できるようになりました。これは、最近一般的なアプローチです.

実際には、タブバーを画面の下部に配置したいのですが

これは Android デザイン ガイドラインに違反していることに注意してください: http://developer.android.com/design/patterns/pure-android.html

于 2012-09-14T17:10:34.390 に答える
7

これを使用して、ActionBar のスタックされたタブまたはスタックされていないタブを Gingerbread から KitKat に強制します。

Modded From: 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) {}
    }
于 2014-05-16T13:50:28.027 に答える
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);
    }
}
于 2014-02-14T12:29:58.903 に答える