【问题标题】:How does action_bar_embed_tabs exactly work in Android?action_bar_embed_tabs 在 Android 中究竟是如何工作的?
【发布时间】:2023-03-22 13:57:01
【问题描述】:

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

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

【问题讨论】:

    标签: android android-actionbar actionbarsherlock android-tabs


    【解决方案1】:

    我知道这是一篇旧帖子,但我想为未来的读者添加一个使用 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);

    所有致谢Cliff.

    【讨论】:

    • JB 中的嵌入选项卡策略似乎已更改。摘录:“嵌入式选项卡的新 ActionBar 策略:无论屏幕大小如何,嵌入式选项卡现在总是在纵向模式下堆叠在操作栏中。”来自:http://developer.android.com/reference/android/os/Build.VERSION_CODES.html#JELLY_BEAN 这实际上对我有用 - 在 4.0.4 上进行了测试。
    • 感谢您的完美回答!效果很好!
    【解决方案2】:

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

    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

    【讨论】:

      【解决方案3】:

      在 ActionBarSherlock 中,abs__action_bar_embed_tabs 用于判断 Tabs 是否应该嵌入到 ActionBar 中,值存储在两个文件中。

      1. 在值/abs__bools.xml 中。这是错误的。
      2. 在值-w480/abs__bools.xml 中。这是真的。

      这意味着仅当设备宽度大于 480dp 时才会嵌入选项卡。我觉得这样的配置已经满足你的要求了。

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

      编辑: 好的,我试过了。它不能工作。事实上,它只在 HONEYCOMB 下工作。由于之前honeycomb sherlock action bar 有它自己的ActionBarImpl,所以你可以改变这个值。但是在ActionBar的原生实现中,这个值为com.android.internal.R.bool.action_bar_embed_tabs,不能修改。

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

      非常抱歉让您感到困惑。

      【讨论】:

      • 我已经尝试过这个解决方案,但选项卡仍然出现在操作栏中。你能给我一个样品吗?
      【解决方案4】:

      在这个文件中:ActionBarImpl.java

      在private void setHasEmbeddedTabs(boolean hasEmbeddedTabs)

      更改值:
      mHasEmbeddedTabs = hasEmbeddedTabs;

      至:
      mHasEmbeddedTabs = false;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-26
        • 2023-04-01
        • 2011-06-26
        • 2021-08-15
        • 2012-06-08
        • 2011-10-11
        • 2013-07-05
        相关资源
        最近更新 更多