2016-11-29 19 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 = StandardからNavigationMode = Tabsに切り替えると。

開始ポートレート(グッド): enter image description here

その後ランドスケープ(グッド):ポートレートに戻って次に enter image description here

(悪い):enter image description here

はにどのように任意の提案をありがとう正しい。

答えて

1

私の問題は、タイミング問題であることが判明しました。私はXamarinフォームTabbedPage(Element)の派生クラスのSizeChangedイベントで非表示/表示をトリガーしていました。そのイベントは、画面の向きを評価し、その結果に基づいてIsTabBarVisibleプロパティを設定します。

要素のPropertyChangedイベントを購読しているTabbedRendererが、IsTabBarVisibleプロパティの変更を監視しています。上記のHideShowTabs()メソッドは、IsTabBarVisibleプロパティで変更が検出されたときにレンダラーで呼び出されました。

レンダラにすべてのロジックを保存すると、問題が解決しました。 OnConfigurationChangedをオーバーライドすると、オリジナルのHideShowTabs()メソッドで同じロジックを使用して向きの変更をチェックし、それに応じてタブを非表示/表示します。

これにより、レンダラの柔軟性が低下する一方で、今のところ私の問題が解決されます。私はNavigationModeの変更が正しくレンダリングされるように、より良い方法で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); 
    }