【Android】ステータスバーの色を変更する

ステータスバーの色を変更するのは下記で実施できます。

window.statusBarColor = Color.CYAN
  • 反映後

f:id:komattin:20191011151702p:plain

テキストやアイコンの色も変更したい場合

背景色を白とした場合、テキストやアイコンの色も白の為表示されません。 テキストの色を変更する為のプロパティや関数は用意されておりませんので、 SystemUiVisibilityを用いてビット操作する必要があります。

val state = StatusBarState.Dark

// ステータスバーの色変更
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

    window.apply {
        var newUiVisibility = decorView.systemUiVisibility

        if (state == StatusBarState.Light) {
            // 白背景
            statusBarColor = Color.WHITE
            // 黒のアイコン・テキスト
            newUiVisibility = newUiVisibility or SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
        } else if (state == StatusBarState.Dark) {
            // 黒背景
            statusBarColor = Color.BLACK
            // 白のアイコン・テキスト
            newUiVisibility = newUiVisibility and SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv()
        }

        when (state) {
            StatusBarState.Light -> {
                // 白背景
                statusBarColor = Color.WHITE
                // 黒のアイコン・テキスト
                newUiVisibility = newUiVisibility or SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
            }
            StatusBarState.Dark -> {
                // 黒背景
                statusBarColor = Color.BLACK
                // 白のアイコン・テキスト
                newUiVisibility = newUiVisibility and SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv()
            }
        }

        decorView.systemUiVisibility = newUiVisibility
    }
}
背景:白、テキスト:黒 背景:黒、テキスト:白
f:id:komattin:20191011152359p:plain f:id:komattin:20191011152409p:plain

JavaとKotlinの比較

これからKotlinを始めるJavaプログラマ向けの記事です。
説明は最小限としています。
JavaをKotlinに置換する場合、どう記述するのかを
見ながら覚えていきましょう。

基本構文

変数

public static void main(String args[]) {
    
    int a;
    a = 1;

    final int b = 2;
    System.out.println("a = " + a + "b = " + b);
}
  • kotlin
fun main(args: Array<String>) {
    
    var a: Int     // varは後から変更可能。
    a = 1
    
    val b = 2      // valは後から変更不可。型推論で型省略可。
    println("a = $a, b = $b")
}

変数 - Optional

public static void main(String args[]) {

    String s = null;
    if (s != null) {
        System.out.println(s);
    }

    s = "not null"

    // Optionalを使った場合
    Optional.ofNullable(s).ifPresent(System.out::println); 
}
  • kotlin
fun main(args: Array<String>) {

    var s: String? = null
    if (s != null) {
        println(s)
    }

    s = "not null"

    // sがnullで無い時にprintlnを実行。
    // ラムダ式の引数が一つ場合、省略した形式の「it」で参照できる
    s?.let { println(it) }
}

if式

public static void main(String args[]) {
    int a = 1;
    int b = 2;
    String result;
    if (a < b) {
        result = "結果:aはbより小さい"; 
    } else {
        result = "結果:aはbより大きい"; 
    }
    System.out.println(result);
}
    int a = 1;
    int b = 2;
    String result = a < b ? "結果:aはbより小さい" : "結果:aはbより大きい"
  • Kotlin
fun main(args: Array<String>) {
    val a = 1
    val b = 2
    val result = if (a < b) "結果:aはbより小さい" else "結果: aはbより大きい"
    println(result)
}

[Point!] Kotlinには三項演算子がないので、以下のようにif式で代用する。
[Point!] String Templates ( $a の形式で変数 a の値を文字列に埋め込み可能)

when式

public static void main(String args[]) {
    int value = 1;
    String result = null;

    switch (value) {
        case 0:
            result = "0 です";
            break;
        case 1:
            result = "1 です";
            break;
        default:
            result = "その他 です";
            break;
    }
    System.out.println(result);
}
  • Kotlin
fun main(args: Array<String>) {
    val value = 1

    val result = when(value) {
        0 -> "0 です"
        1 -> "1 です"
        else -> "その他 です"
    }
    println(result)
}

when式 - Javaでswitch+if文を用いるケース

*Java

public static void main(String args[]) {
    String value1 = "grape";
    String value2 = "cake";
    String result = null;

    switch (value1) {
        case "apple":
            result = "appleです";
            break;
        case "banana":
            result = "bananaです";
            break;
        default:
            if (value2.equals("cake") {
                result = "cakeです";
            } else {
                result = "その他の食べ物です";
            }
            break;
    }
    System.out.println(result)
}
  • Kotlin
fun main(args: Array<String>) {
    val value1 = "grape";
    val value2 = "cake";

    val result = when {
        value1 == "apple" -> "appleです"
        value1 == "banana" -> "bananaです"
        value2 == "cake" -> "cakeです"
        else -> "その他の食べ物です"
    }
    println(result)
}

method

引数なし、戻り値なし

private void print() {
    System.out.println("print");
}

public static void main(String args[]) {
    print()
}
  • Kotlin
private fun print() {
    println("print")
}

fun main(args: Array<String>) {
    print()
}

[Point!] 式が1つだけの場合は{}を省略可能。戻り値の型も省略できます。

  • Kotlin
private fun print(): Unit = println("print")

fun main(args: Array<String>) {
    print()
}

引数2つ、戻り値なし

private void addition(int a, int b) {
    int result = a + b;
    System.out.println("答え:" + result);
}

public static void main(String args[]) {
    addition(1, 2)
}
  • Kotlin
private fun addition(a: Int, b: Int) {
    val result = a + b
    println(result)
}

fun main(args: Array<String>) {
    addition(1, 2)
}

引数2つ、戻り値あり

private void multiplication(int a, int b) {
    return a * b;
}

public static void main(String args[]) {
    int result = multiplication(2, 3)
    System.out.println(result);
}
  • Kotlin
private fun multiplication(a: Int, b: Int): Int {
    return a * b
}

fun main(args: Array<String>) {
    val result = multiplication(2, 3)
    println(result)
}

[Point!] 式が1つだけの場合は{}を省略可能。

  • Kotlin
private fun multiplication(a: Int, b: Int): Int = a * b

fun main(args: Array<String>) {
    println(multiplication(2, 3))
}

[Point!] さらに戻り値の型も型推論によって省略可能。

  • Kotlin
private fun multiplication(a: Int, b: Int) = a * b

fun main(args: Array<String>) {
    println(multiplication(3, 4))
}

戻り値複数

class Pair {
    private String key;
    private int value;
    
    Pair(String key, int value) {
        this.key = key;
        this.value = value;
    }

    String getKey() {
        return key;
    }
    int getValue() {
        return key;
    }
}

class Main {
    private Pair getPairValue() {
        // 2つ以上の値は返却できないので自作のクラス型で返す
        Pair pair = new Pair("age", 30);
        return pair;
    }

    public static void main(String args[]) {
        Pair pair = getPairValue();
        System.out.println(pair.getKey() + ":" pair.getValue());
    }
}
  • Kotlin
// KotlinのPairクラスを使用
private fun getPairValue(): Pair<String, Int> = Pair("age", 30)

fun main(args: Array<String>) {
    val pair = getPairValue()
    println("${pair.first} : ${pair.second}")

    // このように変数として受け取ることも可能
    var (key, value) = pair
    println("key=$key, value=$value")
}

Android Studio 環境構築

Android Studio のインストールとセットアップ

WindowsMacも基本的には一緒ですが、
ここではMacをベースに説明していきます。

①DevelopersサイトからAndroid Studioをダウンロードする

↓↓↓ ダウンロードはこちらから ↓↓↓

> DOWN LOAD

f:id:komattin:20190916171555p:plain
[ANDROID STUDIO をダウンロード] をクリック

f:id:komattin:20190916171649p:plain
同意しますにチェックし、
[ANDROID STUDIO FOR MAC ダウンロード]をクリック

Android Studioをインストールする

f:id:komattin:20190916171811p:plain
Applicationsにドラッグ&ドロップし、インストールを開始する

Android Studio のセットアップ

f:id:komattin:20190916171907p:plain
Welcom画面が表示されたら [Next] ボタンをクリック

f:id:komattin:20190916171949p:plain
◉Standardを選択し、 [Next] ボタンをクリック

f:id:komattin:20190916172124p:plain
Light
f:id:komattin:20190916172154p:plain
Darcula
好みのUIテーマを選択し、 [Next] ボタンをクリック

f:id:komattin:20190916172340p:plain
☑️ Performance:エミュレータの高速化
☑️ Android Virtual Device:Android仮想デバイス をチェックし、
[Next] ボタンをクリック。
(PCのスペックが低くなければ、エミュレーターはあった方が良いです)

f:id:komattin:20190916172656p:plain
[Finish] をクリックし、コンポーネントのダウンロードを開始する

f:id:komattin:20190916172730p:plain
10分程度待ちましょう。

f:id:komattin:20190916172809p:plain
10分程度で上記のようにユーザ名とパスワードの入力を求められます。
入力後、OKをクリックし、HAXMのインストールを開始してください。

f:id:komattin:20190916172929p:plain
ダウンロードが完了したら、[Finish]をクリックします。

SDK の追加インストール

f:id:komattin:20190916173053p:plain
[SDK Platforms]ではデバッグ実行用の端末のバージョンを一通りインストールしておくと良いです。
・自身の持っている端末のAndroidバージョン
・7系以上の端末一通り など

f:id:komattin:20190916173226p:plain
[SDK Tools]ではGoogle Play Licensing LibraryGoogle Play services あたりを最低限 インストールしておくと良いでしょう。

f:id:komattin:20190916173406p:plain
[OK]でインストールを開始します

f:id:komattin:20190916173436p:plain
◉ Accept を選択し、[Next]をクリックします

f:id:komattin:20190916173524p:plain
インストールの量にも寄りますが、
時間がかかりますので、しばらくお待ちください。
終わり次第、[Finish]をクリックして終了してください。

以上でAndroid Studioのインストールとセットアップが完了です。

日付表示の多言語対応

端末の言語設定に合わせて、日付の表示を切り分ける

import android.databinding.DataBindingUtil
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.text.format.DateFormat
import world.xenos.myapplication.databinding.ActivityMainBinding
import java.util.*

class MainActivity : AppCompatActivity() {

    private val binding by lazy { DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main) }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        binding.textLanguage.text = "Language : ${Locale.getDefault().displayLanguage}"

        val dateText = DateFormat.getLongDateFormat(applicationContext).format(Calendar.getInstance().time)

        binding.textDate.text = "Date : $dateText"
    }
}
f:id:komattin:20190916170905p:plain
English
f:id:komattin:20190916171001p:plain
Japanese

初めてのAndroid Studio プロジェクト作成と実行

①プロジェクトの作成

f:id:komattin:20190916161812p:plain

エントリーポイントとなるActivity名を決めます。 TopActivityなりSplashActivityなどと命名するべきですが、 今回まMainActivityとそのまま進みます。

 

f:id:komattin:20190916155750p:plain

Android Studioを起動

f:id:komattin:20190916155839p:plain

Start a new Android Studio project を選択

f:id:komattin:20190916155909p:plain

アプリ名を入力し、Company domainを入力します。(xxx_company.co.jp など)
locationは書類配下にAndroidProjectなどのディレクトリを作成し管理するのが良いでしょう。
package nameはcompany domainから自動的入力されますが、Editから変更可能です。
(Dotで区切られた形でディレクトリ階層となります : world/xenos/myapplication/...)
また、Javaでは無くKotlinで開発する場合は、 ☑️ Include Kotlin support を選択します。
[Next]をClickし次へ進みます。

f:id:komattin:20190916161125p:plain

最低のSDKヴァージョンを指定します。
後からも変更可能です。上記ではAPI26: Android 8.0を選択しています。
(上記設定では、およそ6%の人が実行可能なようですね)

f:id:komattin:20190916161523p:plain

エントリーポイントとなるActivityのベースを選択します。
これも後から変更できますので、基本的にはEmpty Activityで良いです。

f:id:komattin:20190916161935p:plain

エントリーポイントとなるActivity名を決めます。
TopActivityなりSplashActivityなどと命名することが、多いと思いますが
今回はMainActivityのまま進みます。

f:id:komattin:20190916162213p:plain

プロジェクトの作成が終わったらFinishを押します。

エミュレーターの作成

f:id:komattin:20190916162356p:plain

右下に 2 processes running... とgradleが動いている間は表示されます。
しばらく待ちましょう。

f:id:komattin:20190916162532p:plain

完了したら、右上の実行ボタン▶️を押します。

f:id:komattin:20190916162636p:plain

今回はエミュレータを自分で作って実行しますので、
Create New Virtual DeviceをClickしてください。
(開発者モードに設定された端末を接続している場合はこの画面の候補に出てきます。)

f:id:komattin:20190916162836p:plain

任意の端末を選択します。
(Phone / Nexus 6P あたりの高解像度端末がいいでしょう)

f:id:komattin:20190916163025p:plain

Nextを押します

f:id:komattin:20190916163121p:plain

任意のAVD Nameを入力が済みましたら
エミュレーターの詳細な設定を行うため、
Show Advanced SettingsをClickします。

f:id:komattin:20190916163417p:plain

PCのスペックに余裕があれば
RAM: 2048 MB, VM heap: 512 MB くらいに上げておきましょう。
入力したらFinishをClickします。

エミュレーターデバッグ

f:id:komattin:20190916164320p:plain

上記のようにエミュレーターが起動します。
Android StudioではLog Catにずらずらと情報が出力され、
ビルドの進捗バーも表示されると思います。

f:id:komattin:20190916164403p:plain

無事にHello Worldと表示されましたでしょうか?
停止する時はアプリのタスクキルか、
Android Studioの 停止ボタン□ を押してください。