DEV Community

kaede
kaede

Posted on • Edited on

Android 基礎 -- Part 01 Jetpack Compose を使って Hello Android のアプリを生成して setContent と Preview の意味を学ぶ

Jetpack Compose について調査する


Jetpack Compose の概要と書き方を調べる

https://qiita.com/kota_2402/items/7bbdd87be8024785e25b#jetpack-compose-1

宣言的に UI が書ける Google の Android 用フレームワーク。


宣言的ってなんだっけ?

https://qiita.com/Hiroyuki_OSAKI/items/f3f88ae535550e95389d#declarative%E3%81%AA%E8%A8%80%E8%AA%9E

コーヒーを淹れる例を、宣言的と命令的と対比すると

宣言的は

コーヒーを一杯くれ
Enter fullscreen mode Exit fullscreen mode

などと欲しいものを要求する書き方で

命令的は

お湯を沸かせ。コップに入れろ。コーヒーの粉を入れろ。混ぜろ。机の上にもってこい。
Enter fullscreen mode Exit fullscreen mode

などと作業の詳細を細かく記述するのが命令的だと解釈した。


宣言的らしい Jetpack のコードを記事で見てみる

https://qiita.com/kota_2402/items/7bbdd87be8024785e25b#jetpack-compose

この Qiita の kota_2402 さんのコードを見てみると

fun myApp() {
  MaterialTheme {
    Center {
      Text()
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

このように、構造的にわかりやすく書けることが確認できた。
React っぽい。ロジックをどこに書くかは謎。

これは普通に XML で書くより遥かにやりやすそうに見える。


Jetpack Compose でどうやって Android アプリが作成されるかを調べる

https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/README.md

Android Google 公式によると

jar ファイルや aar ファイル (jar の Android 版と予想)
これが Maven で DL できて

androidx.* でインポートできるらしい。

https://www.youtube.com/watch?v=wTqfr2rO7SM&list=PLgAI_5b_7BdRaBPAD5RMrzjoSwefDXpkw&index=1

MokeLab さんの動画によると、
最初にプロジェクトを作成するときに、
Empty Compose Activity で作成すれば

最初から Jetpack Compose で UI が作成されるらしい。


実際に Jetpack Compose でプロジェクトを作ってみる


現在のプロジェクトを閉じて新しいプロジェクトを Jetpack Compose で作る

Image description

画面の左上の Menu -> File -> Close Project で

現在の XML で書かれているプロジェクトを閉じる

Image description

するとプロジェクト一覧の画面に戻れる。

ここから New Project で Hello Jetpack というプロジェクトを作る。

Image description

もちろん Empty Compose Activity を選択

これで Jetpack Compose のプロジェクトが作成される。



setContent の中の書き方を覚える


作成した Jetpack Compose のプロジェクトの setContent の中身を見る

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            HelloJetpackTheme {
                // A surface container using the 'background' color from the theme
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colors.background
                ) {
                    Greeting("Android")
                }
            }
        }
    }
}

@Composable
fun Greeting(name: String) {
    Text(text = "Hello $name!")
}

@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
    HelloJetpackTheme {
        Greeting("Android")
    }
}
Enter fullscreen mode Exit fullscreen mode

setContent という main っぽい関数の中で
Surface という関数に
modifier としてサイズを渡し
color として色を渡し
Greeting という関数に Android という文字列を渡している。


ビルドして実行する

これをビルドして実行してみる。

Image description

Hello Android と右上つめで表示された。


背景色を変えてみる

Surface(
    modifier = Modifier.fillMaxSize(),
    color = MaterialTheme.colors.secondary
) {
Enter fullscreen mode Exit fullscreen mode

Surface に渡している color の値を backgroud から secondary に変えてみる。

すると、背景色がエメラルドグリーンになった。南国気分!

Image description


他の colors も見てみる

この colors は、alt クリックで辿ると
androidx / compose / material / Color.kt / lightColors
ここに

fun lightColors(
    primary: Color = Color(0xFF6200EE),
    primaryVariant: Color = Color(0xFF3700B3),
    secondary: Color = Color(0xFF03DAC6),
    secondaryVariant: Color = Color(0xFF018786),
    background: Color = Color.White,
// ...
Enter fullscreen mode Exit fullscreen mode

こうやって定義されていた。
androidx の提供だけど、Java のライブラリと違って「あなたはライブラリのコード見ています」と注釈が出ないので、書き換えられそうに見える。



@Preview によるコンポーネントプレビューを確認する


@Preview って何?

HelloJetpackTheme/Greeting がなぜ二回よばれているのか気になった。

setContent で HelloJetpackTheme で Greeting が使われて
At Preview の At Composable の DefaultPreview 関数でも
HelloJetpackTheme で Greeting が使われている。

https://developer.android.com/jetpack/compose/preview?hl=ja

調べてみると、レイアウトプレビューといい

Image description

Split タブで、DefaultPreview の関数内部で呼び出したものだけ見ることができた。


@Preview を削ると?

Image description

At Preview の区画を削ると、プレビューができなくなったが
正常にビルドして実行することはできた。


変更してプレビューで見てみる

Image description

Greeting に渡している文字列を変更すると即座にプレビューに反映された。
すぐに動作確認できるのでこれは便利。


プレビューで呼び出すコンポーネントの関数名を変更してみる

Image description

DefaultPreview となっている関数名はカスタム可能だった。


Preview にのみ背景をつけてみる

setContent の内部と同じように色をつけてみる

@Preview(showBackground = true)
@Composable
fun DefaultPreviewWithCustomName() {
    HelloJetpackTheme {
        Surface(
            modifier = Modifier.fillMaxSize(),
            color = MaterialTheme.colors.error
        ) {
            Greeting("Preview with Color")
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

Image description

ちゃんとプレビュー内部でも背景色がついた。
毎回ビルドしなくても UI コンポーネント単体なら
これで見た目を確認できるようだ。 

https://developer.android.com/jetpack/compose/preview?hl=ja#basics

複数プレビューもできるらしい。
ビジネスサイドに見せやすそう。

Top comments (0)