2016-11-29 64 views
0

我正在使用自定义TabbedRenderer动态隐藏和显示Android上的ActionBar中的选项卡。在横向方向上,我隐藏了标签,因为我可以将补充内容并排放置。纵向显示标签,以便用户可以单击该标签查看补充内容。渲染器通过改变动作条NavigationMode如下实现隐藏和显示:Xamarin ActionBar隐藏显示选项卡问题

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 = StandardNavigationMode = Tabs凸片现在覆盖的标题在主导航栏如下。

启动人像(良好): enter image description here

然后景观(良好): enter image description here

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

谢谢你的任何建议,就如何正确。

回答

1

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

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

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

虽然这使得渲染器不够灵活,但它现在解决了我的问题。我将不得不追踪更好的方式来定时导航模式更改,以便正确渲染。无论如何,如果我正在处理这种错误的方式,请接受建议。谢谢。

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