action_bar_embed_tabs如何在Android中正常运行?

时间:2012-11-27 09:32:51

标签: android android-actionbar actionbarsherlock android-tabs

我在操作栏中有标签。 在大屏幕上,标签嵌入到操作栏中,但在小屏幕上则没有。 我想控制选项卡手册,以便我可以将选项卡与操作栏分开。 我试图设置abs__action_bar_embed_tabs,但这不起作用

<resources>
    <bool name="abs__action_bar_embed_tabs">false</bool>
</resources>

4 个答案:

答案 0 :(得分:9)

我知道这是一篇旧帖子,但我想为将来的读者使用action_bar_embed_tabs添加解决方案。

创建以下方法(注意导入),

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();
    }

    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 src="http://www.blogc.at/wp-includes/images/smilies/icon_wink.gif" alt=";-)" class="wp-smiley">
            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) {}
}

然后如下所示调用,

  1. 如果您希望标签显示在操作栏内,

    setHasEmbeddedTabs(actionBar, true);

  2. 如果您希望标签显示在操作栏的下方/下方,

    setHasEmbeddedTabs(actionBar, false);

  3. Cliff.

    的所有学分

答案 1 :(得分:6)

我找到了一个在代码中分隔标签的解决方案。

private void embeddedTabs(Object actionBar, Boolean embed_tabs) {
    try {
        if (actionBar instanceof ActionBarWrapper) {
            // ICS and forward
            try {
                Field actionBarField = actionBar.getClass()
                        .getDeclaredField("mActionBar");
                actionBarField.setAccessible(true);
                actionBar = actionBarField.get(actionBar);
            } catch (Exception e) {
                Log.e("", "Error enabling embedded tabs", e);
            }
        }
        Method setHasEmbeddedTabsMethod = actionBar.getClass()
                .getDeclaredMethod("setHasEmbeddedTabs", boolean.class);
        setHasEmbeddedTabsMethod.setAccessible(true);
        setHasEmbeddedTabsMethod.invoke(actionBar, embed_tabs);
    } catch (Exception e) {
        Log.e("", "Error marking actionbar embedded", e);
    }
}

但现在我遇到了一个新问题。标签不会完全填充标签栏。 Actionbar tabs don't fill the tabbar

答案 2 :(得分:1)

在ActionBarSherlock中,abs__action_bar_embed_tabs用于确定是否应将Tabs嵌入ActionBar中,并将值存储在两个文件中。

  1. 在values / abs__bools.xml中。这是假的。
  2. 在values-w480 / abs__bools.xml中。这是真的。
  3. 这意味着仅当设备的宽度大于480dp时才会嵌入Tabs。我认为这样的配置已经满足了你的要求。

    如果你想自己控制它,你可以用你想要的任何配置限定符创建你自己的values文件夹,并覆盖这个bool值。

    修改 好的,我试过了。它不能工作。实际上,它只能在HONEYCOMB下工作。因为在蜂窝状sherlock动作栏之前它有自己的ActionBarImpl,所以你可以改变这个值。但是在ActionBar的本机实现中,此值为com.android.internal.R.bool.action_bar_embed_tabs,无法修改。

    所以..虽然我不赞成反思机制,但也许这是实现目标的唯一途径。

    我很抱歉让你感到困惑。

答案 3 :(得分:0)

在此文件中:ActionBarImpl.java

on private void setHasEmbeddedTabs(boolean hasEmbeddedTabs)

更改值:
mHasEmbeddedTabs = hasEmbeddedTabs;

于:
mHasEmbeddedTabs = false;