2016-11-29 3 views
0

Я работаю над возможностью динамически скрывать и показывать вкладки в ActionBar на Android с помощью пользовательского TabbedRenderer. В альбомной ориентации я скрываю вкладки, потому что я могу поместить дополнительный контент бок о бок. В портрете я показываю вкладки, чтобы пользователь мог щелкнуть вкладку, чтобы просмотреть дополнительный контент. Визуализатор реализует скрытие и показ, изменив ActionBar NavigationMode следующим образом:Xamarin ActionBar Hide Show Tabs Выпуск

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

Оказывается, моя проблема - вопрос времени. Я запускал hide/show в событии SizeChanged класса Xamarin Forms TabbedPage (Element). Это событие оценило ориентацию экрана и задало свойство IsTabBarVisible на основе результата.

TabbedRenderer подписался на события PropertyChanged элемента, наблюдая за изменениями свойства IsTabBarVisible. Метод HideShowTabs() выше был вызван в рендерере, когда изменения были обнаружены в свойстве IsTabBarVisible.

Проблема исчезла, когда я сохранил всю логику в рендерере. Переопределяя 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); 
    }