SIN@SAPPOROWORKSの覚書

C#を中心に、夜な夜な試行錯誤したコードの記録です。

Xamarin.Forms NavigationPageでアクションバーのアイコンを非表示にする(Android)

【 Xamarin 記事一覧 】

アクションバーのアイコン

Xamarin.FormsでNavigationPageを使用すると、Androidでは、ページの左上にアイコンが表示されます。
このアイコンの消す方法は、Xamarin.Formsの機能としては提供されておらず、力づくなら、背景色に紛れた1ドットのアイコンなどに置き換えるしかないようです。

今回は、NavigationPageのレンダラーを記述して、正規に(?)、このアイコンを非表示にする方法が、Xamarinのフォーラムで紹介されていたので、ここに記録しました。

f:id:furuya02:20150310094150p:plain:w200:leftf:id:furuya02:20150310094148p:plain:w200:left

NavigationPage

NavigationPageを使用したPCL側のコードです。
レンダラー記述のためだけにNavigationPageの拡張クラス(ExNavigationPage)を作成しています。

//App.cs
using Xamarin.Forms;
namespace App1{
    public class App : Application{
        public App(){
            //ルートビューをNavigationPageにする
            MainPage = new ExNavigationPage(new MainPage());
        }
        //・・・省略・・・
    }

    //拡張NavigationPage レンダラのためだけのクラス
    public class ExNavigationPage : NavigationPage {
        public ExNavigationPage(Page root) : base(root) {}
    }

    class MainPage : ContentPage {
        public MainPage() {
            //中央にラベル「MainPage」を配置する
            Content = new StackLayout {
                VerticalOptions = LayoutOptions.Center,
                Children = { 
                    new Label {
                        XAlign = TextAlignment.Center,
                        Text="MainPage"
                    }
                }
            };
        }
    }
}

レンダラー

レンダラー側のコードは、次のようになります。
NavigationRendererクラスの、ContextプロパティがActivityクラスなので、そこからActionBarオブジェクトへたどれます。
ActionBarオブジェクトのSetIconメソッドで、Android.Resource.Color.Transparentを指定すると、アイコンは非表示になります。

//ExNavigationPageRenderer.cs
using Android.App;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(ExNavigationPage), typeof(ExNavigationPageRenderer))] 
namespace App1.Droid{
    class ExNavigationPageRenderer : NavigationRenderer{
        protected override void OnElementChanged(ElementChangedEventArgs<NavigationPage> e) {
            base.OnElementChanged(e);

            var actionBar = ((Activity)Context).ActionBar;
            actionBar.SetIcon(Android.Resource.Color.Transparent);
        }
    }
}

ActionBarオブジェクトのメソッドである、SetDisplayShowHomeEnabledやSetDisplayShowTitleEnabledは、この場合、有効に機能しません。

//このコードで、アイコンの非表示やタイトルバーの非表示はできない

actionBar.SetDisplayShowHomeEnabled(false);
actionBar.SetDisplayShowTitleEnabled(false);


参考資料

Remove icon from action bar from xamarin forms android project - Xamarin Forums
xml - Remove icon/logo from action bar on android - Stack Overflow



【 Xamarin 記事一覧 】