修改actionBar在运行时的外观

时间:2013-11-25 20:02:54

标签: android android-actionbar

在我的应用程序中,我使用ActionBar(nether ABS或支持操作栏!minSDK = 14)。用户可以选择是使用图标还是基于文本的选项卡。 在处理屏幕旋转时我仍然面临一些问题。基本上,我在顶部设置了customView(使用getActionBar.setCustomView()),其中放置了一些文本和控件元素。在纵向模式下,一切正常,但旋转设备会弄乱我的UI。

我发布了一些截图来说明问题(图标已更改为虚拟)。

这里的问题是标签堆叠,我发现没有办法强迫ActionBar保持二线。如果你知道怎么做,我会非常感谢解决方案。

因此,基于ActionBar在横向模式下保持单行的事实,我至少尝试自定义选项卡文本背后的背景以匹配我的设计并且它有效。

真正的问题从图标模式开始。肖像:

enter image description here

这里的一切都很好。旋转设备:

enter image description here

正如您所看到的,customView并且标签区域在一行中没有空格。但是由于android开发团队认为他们的ActionBar比我们聪明,系统完全忽略了空间不足,将标签按在一起并将customView放在右边,使其与标签重叠。这完全搞砸了我的UI,我正在寻找任何可能的解决方案(由于某些原因,我被迫使用ActionBar而不是其他东西。)

如果您需要一些与设置ActionBar相关的代码,我会发布它,虽然它几乎是默认实现,所以我认为这与问题无关。我问的是如何解决上述问题的一些基本想法。

1 个答案:

答案 0 :(得分:1)

您可以使用反射强制标签在纵向和横向模式下以两行显示。 ActionBarImpl#setHasEmbeddedTabs(boolean)控制是否嵌入选项卡(显示为下拉列表)。通过反射,我们将布尔值false传递给它。

查看以下内容是否有帮助:

ActionBar mActionBar = getActionBar();

// Set navigation mode      
mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

// Initialize and add tabs      
for (int i=1; i <= 20; i++) {
    Tab tab = mActionBar.newTab();
    tab.setText("Tab " + i);
    tab.setTabListener(this);
    mActionBar.addTab(tab);
}

Method setHasEmbeddedTabsMethod = null;

try {
    setHasEmbeddedTabsMethod = mActionBar.getClass().
                                    getDeclaredMethod("setHasEmbeddedTabs", 
                                                        boolean.class);
} catch (NoSuchMethodException e1) {
    e1.printStackTrace();
}

setHasEmbeddedTabsMethod.setAccessible(true);

try {
    setHasEmbeddedTabsMethod.invoke(mActionBar, false);
} catch (IllegalArgumentException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
} catch (InvocationTargetException e) {
    e.printStackTrace();
}