在4.0.3中调用setDisplayShowHomeEnabled(false)时,选项卡显示在ActionBar上方

时间:2014-12-05 16:51:09

标签: android android-actionbar xamarin xamarin.android

我使用ActionBar标签导航模式和ViewPager。这在较新版本的Android中运行良好,但在Android 4.0.3上,标签位于ActionBar的顶部而不是下方。

如果我使用ActionBar.SetDisplayShowHomeEnabled(true),则问题似乎已得到解决。但是,向上导航则不起作用。

screen shot of Tabs appearing above ActionBar

我的代码如下

ActionBar.SetTitle(Resource.String.DocumentDetails);
ActionBar.SetDisplayHomeAsUpEnabled(true);
ActionBar.NavigationMode = ActionBarNavigationMode.Tabs;

SetContentView(Resource.Layout.Main);

ActionBar.Tab tab = ActionBar.NewTab();
tab.SetText("tab1");
tab.TabSelected += (sender, args) => {
    // Do something when tab is selected
};
ActionBar.AddTab(tab);

tab = ActionBar.NewTab();
tab.SetText("tab2");
tab.TabSelected += (sender, args) => {
    // Do something when tab is selected
};
ActionBar.AddTab(tab);

1 个答案:

答案 0 :(得分:0)

这是在实际设备上吗?我已经在模拟器中测试了您的代码并且无法重现。但是,似乎其他几个人向Google报告了这一情况:https://code.google.com/p/android/issues/detail?id=36191

所以有几个想法来解决这个问题。而不是使用SetDisplayHomeAsUpEnabled尝试使用DisplayOptions属性:

ActionBar.DisplayOptions = ActionBarDisplayOptions.ShowHome | 
                           ActionBarDisplayOptions.HomeAsUp |
                           ActionBarDisplayOptions.ShowTitle;

在这种情况下,重要的是ActionBarDisplayOptions.ShowHome,它会强制显示主页图标,而ActionBarDisplayOptions.HomeAsUp会执行SetDisplayHomeAsUpEnabled(true)所做的事情。最后一个我想你可以猜到。

如果这没有帮助。该问题线程中有一个答案,建议使用扩展方法将标签项设置为嵌入ActionBar。但是,这看起来好像是在平板电脑上运行。代码如下:

using Java.Lang;
using Java.Lang.Reflect;

namespace SomeNamespace
{
    public class ActionBarUtils
    {
        public static void SetHasEmbeddedTabs(Object inActionBar, bool hasEmbeddedTabs)
        {
            var actionBarClass = inActionBar.Class;

            if ("android.support.v7.app.ActionBarImplJBMR2" == actionBarClass.Name)
            {
                actionBarClass = actionBarClass.Superclass.Superclass;
            }
            else if ("android.support.v7.app.ActionBarImplJB" == actionBarClass.Name)
            {
                actionBarClass = actionBarClass.Superclass;
            }

            try
            {
                var actionBarField = actionBarClass.GetDeclaredField("mActionBar");
                actionBarField.Accessible = true;
                inActionBar = actionBarField.Get(inActionBar);
                actionBarClass = inActionBar.Class;
            }
            catch (IllegalAccessException) { }
            catch (IllegalArgumentException) { }
            catch (NoSuchFieldException) { }

            try
            {
                var method = actionBarClass.GetDeclaredMethod("setHasEmbeddedTabs", new[] { Boolean.Type });
                method.Accessible = true;
                method.Invoke(inActionBar, new Boolean(hasEmbeddedTabs));
            }
            catch (NoSuchMethodException) { }
            catch (InvocationTargetException) { }
            catch (IllegalAccessException) { }
            catch (IllegalArgumentException) { }
        }
    }
}

然后可以在Activity

中使用
ActionBarUtils.SetHasEmbeddedTabs(ActionBar, true);