Xamarin
icon
Xamarin.Forms
VisualStudio2015
NavigationPage

NavigationPage利用時のActionBarのアイコンを消す方法

More than 1 year has passed since last update.

こちらのページに、NavigationPageを使った画面遷移のあるアプリを作るチュートリアルがあります。
Xamarin.Forms Multiscreen Quickstart

この説明通りにアプリを作成すると、下図に示すようなアイコンが表示されれるようになります。
ActionBarIcon.png

このアイコンを消す方法はないかと思って調べたところ、2つの方法が見つかりました。
 (1) MainActivity.cs中の属性中に指定されている"Icon"に、透明なアイコンを指定する方法
 (2) レンダラーで透明なアイコンを指定する方法

両方とも試してみましたが、(1)の方法は問題があることが分かりました。というわけでメモしておきます。

(1) MainActivity.cs中の属性に手を加える方法

Phoneword.Droidプロジェクト内に存在する「MainActivity.cs」を開くと、以下のようなコードが存在します。

MainActivity.cs
    [Activity(Label = "Phoneword", Icon = "@drawable/icon", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            global::Xamarin.Forms.Forms.Init(this, bundle);
            LoadApplication(new App());
        }
    }

この
  [Activity(Label = "Phoneword", Icon = "@drawable/icon"...
の部分の"Icon"で指定されているアイコンの絵を、透明な絵を指定することでアイコンの非表示化をする方法が紹介されているページがありました。

以下のように、透明なアイコンの絵を用意して...

Icon属性.png

Activity属性の"Icon"の部分を以下のように変えます。
  [Activity(Label = "Phoneword", Icon = "@drawable/transparent"...

こうすると、確かにActionBar上にはアイコンは非表示(実際には透明なアイコンが表示されている)のですが...

Icon属性変更による方法.png

ホーム画面に戻って、このアプリのアイコンを見てみると、ご覧のようにアイコンが表示されなくなってしまいます。

Icon属性変更による方法1.png

この方法はちょっと使えません。

(2) レンダラーで透明なアイコンを指定する方法

もう一つ紹介されていたのがこの方法です。以下、この方法で紹介されていたソースコードです。

MainActivity.cs
[assembly: ExportRenderer(typeof(NavigationPage), typeof(CustomNavigationRenderer))] // (1)

namespace Phoneword.Droid
{
    [Activity(Label = "Phoneword", Icon = "@drawable/icon", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            global::Xamarin.Forms.Forms.Init(this, bundle);
            LoadApplication(new App());
        }
    }

    // これがアイコンを非表示にするプログラム
    class CustomNavigationRenderer : NavigationRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<NavigationPage> e)
        {
            base.OnElementChanged(e);

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

コード中の(1)ではレンダラーのassemblyをロードしているようです。そして、CustomeNavigationRendererクラスで、アイコンの非表示化を行っています。
 var actionBar = ((Activity)Context).ActionBar;
上記の部分でActionBarのインスタンスを取得しています。この"Context"は、NavigationRendererクラスのプロパティで、Androidの画面(=Activity)を持っているようです。ここからActionBarにアクセスできるようです。
で、そのアクションバーのアイコンを透明にするために、
 actionBar.SetIcon(Android.Resource.Color.Transparent);
というように透明色をしていしているようですね。

これなら、アプリケーションのアイコンは表示されたまま、アクションバーのアイコンは非表示にできます。