読者です 読者をやめる 読者になる 読者になる

C# で Android開発

Androidアプリ開発の本を見ながら、C# で開発してみる。
今回は Chapter 6 まで。苦労した・・・。
まだまだ全然前半戦なのに、先が思いやられる。

5.3 現在の日時を画面に表示するアプリ

時間のフォーマットについて以下を参考に。

標準の日時書式指定文字列
カスタム日時書式指定文字列

using System;

using Android.App;
using Android.Widget;
using Android.OS;

namespace SystemTime
{
    [Activity(Label = "SystemTime", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView (Resource.Layout.Main);

            var dt = DateTime.Now;
            var text = FindViewById<TextView>(Resource.Id.textView);
            text.Text = $"{dt.ToString("D")}\n{dt.ToString("tthh時mm分ss秒fff")}\n{dt.ToString("HH時mm分ss秒fff")}";
        }
    }
}

f:id:yossk:20170401231622p:plain

6.1.5 アクティビティの状態がわかるプログラムを作ってみよう

using Android.App;
using Android.OS;
using Android.Util;

namespace LifeCycle
{
    [Activity(Label = "LifeCycle", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {
        protected override void OnCreate(Bundle bundle)
        {
            Log.Info("TEST", "OnCreate()");
            base.OnCreate(bundle);
            SetContentView (Resource.Layout.Main);
        }

        protected override void OnStart()
        {
            Log.Info("TEST", "OnStart()");
            base.OnStart();
        }

        protected override void OnRestart()
        {
            Log.Info("TEST", "OnRestart()");
            base.OnRestart();
        }

        protected override void OnResume()
        {
            Log.Info("TEST", "OnResume()");
            base.OnResume();
        }

        protected override void OnPause()
        {
            Log.Info("TEST", "OnPause()");
            base.OnPause();
        }

        protected override void OnStop()
        {
            Log.Info("TEST", "OnStop()");
            base.OnStop();
        }

        protected override void OnDestroy()
        {
            Log.Info("TEST", "OnStop()");
            base.OnDestroy();
        }
    }
}

6.1.7 コンテンツプロバイダーを使って画面の明るさを調べてみる

このとき気が付いたけど、AppCompatActivity を継承しないといけなかったようだが、わからなかった・・・。

using Android.App;
using Android.Widget;
using Android.OS;
using Android.Provider;

namespace ContentResolver
{
    [Activity(Label = "ContentResolver", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView (Resource.Layout.Main);

            var tv = FindViewById<TextView>(Resource.Id.textView);
            tv.Text = $"画面の明るさ: {Settings.System.GetString(this.ContentResolver, Settings.System.ScreenBrightness)}";
        }
    }
}

f:id:yossk:20170401232243p:plain

6.1.11 ブロードキャストを受け取るプログラム

これは苦労した。
Javaでは使えるインターフェイスを匿名クラスでインスタンス化する(という言い方合ってる?)ことが出来ないので。
また、以下を参考に。

developer.xamarin.com

using Android.App;
using Android.Content;
using Android.Widget;
using Android.OS;

namespace BroadCast
{
    [Activity(Label = "BroadCast", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {
        private MyBroadcastReceiver br;
        private IntentFilter intentFilter = new IntentFilter();

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView (Resource.Layout.Main);
            br = new MyBroadcastReceiver() { Act = this };
        }

        protected override void OnResume()
        {
            base.OnResume();
            intentFilter.AddAction(Intent.ActionBatteryChanged);
            RegisterReceiver(br, intentFilter);
        }

        protected override void OnPause()
        {
            base.OnPause();
            UnregisterReceiver(br);
        }

        [BroadcastReceiver(Enabled = true)]
        [IntentFilter(new[] { Intent.ActionBatteryChanged })]
        private class MyBroadcastReceiver : BroadcastReceiver
        {
            public MainActivity Act { get; set; }

            public override void OnReceive(Context context, Intent intent)
            {
                var level = intent.GetIntExtra("level", 0);
                var scale = intent.GetIntExtra("scale", 0);
                var tv = Act.FindViewById<TextView>(Resource.Id.textView);
                tv.Text = $"バッテリーの残量: {level / (float)scale * 100} (%)";
            }
        }
    }
}

f:id:yossk:20170401233804p:plain