Xamarin ActionBar隐藏显示选项卡问题

时间:2016-11-29 15:27:20

标签: android xamarin.forms

我正致力于使用自定义TabbedRenderer在Android上的ActionBar中动态隐藏和显示标签。在横向方向上,我隐藏了标签,因为我可以并排放置补充内容。在肖像中,我显示标签,以便用户可以单击选项卡查看补充内容。渲染器通过更改ActionBar NavigationMode来实现隐藏和显示,如下所示:

void HideShowTabs()
{
    var actionBar = ((Activity)Context).ActionBar;

    if ((Element as MyTabbedPage).IsTabBarVisible)
    {
        if (actionBar.NavigationMode != ActionBarNavigationMode.Tabs)
            actionBar.NavigationMode = ActionBarNavigationMode.Tabs;
    }
    else if (actionBar.NavigationMode == ActionBarNavigationMode.Tabs)
        actionBar.NavigationMode = ActionBarNavigationMode.Standard;

}

问题是,当我从NavigationMode = Standard切换到NavigationMode = Tabs时,标签现在会覆盖主导航栏中的标题,如下所示。

开始人像(好): enter image description here

然后风景(好): enter image description here

然后回到肖像(坏): enter image description here

感谢您提供有关如何纠正的建议。

1 个答案:

答案 0 :(得分:1)

原来我的问题是时间问题。我在Xamarin Forms TabbedPage派生类(Element)的SizeChanged事件中触发了hide / show。该事件评估了屏幕方向,并根据结果设置了IsTabBarVisible属性。

TabbedRenderer订阅了Element的PropertyChanged事件,观察IsTabBarVisible属性的更改。在IsTabBarVisible属性中检测到更改时,在渲染器中调用上面的HideShowTabs()方法。

当我在渲染器中保留所有逻辑时,问题就消失了。重写OnConfigurationChanged,我使用原始HideShowTabs()方法中的相同逻辑检查方向更改并相应地隐藏/显示选项卡。

虽然这会使渲染器不那么灵活,但它现在解决了我的问题。我将不得不追踪一种更好的方法来定时更改NavigationMode,以便正确渲染。如果我正以错误的方式处理这个问题,请接受建议。感谢。

protected override void OnConfigurationChanged(Configuration newConfig)
    {
        var actionBar = ((Activity)Context).ActionBar;

        if (Android.Content.Res.Orientation.Landscape == Resources.Configuration.Orientation)
        {
            if (actionBar.NavigationMode == ActionBarNavigationMode.Tabs)
            {
                actionBar.NavigationMode = ActionBarNavigationMode.Standard;
            }
        }
        else
        {
            if (actionBar.NavigationMode != ActionBarNavigationMode.Tabs)
            {
                actionBar.NavigationMode = ActionBarNavigationMode.Tabs;
            }
        }

        base.OnConfigurationChanged(newConfig);
    }