[Jetpack Compose] タスクマネージャー編

## はじめに
4日ぶりの投稿です。本記事では、先日投稿した記事に続き、[「Composeを用いたAndroidアプリの基礎」](https://developer.android.com/courses/android-basics-compose/course?hl=ja)というコース内でタスクマネージャーといったお題に挑戦して得られた知識を共有したいと思います。

## お題について
Jetpack Composeの基本を用いて、↓画像のような画面を作るのが今回のお題でした。


![タスクマネージャー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336555/e7b78193-a916-caca-c9d1-f245e68ee186.png)

そして、お題に関数UI仕様は次のようなでした。

>![UI仕様](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336555/03cfba77-c7a9-74e7-5ec8-66466079157e.png)
> 1. すべてのコンテンツを画面の垂直方向と水平方向に中央揃えで配置します。
> 2. 最初の```Text```コンポーザブルを、フォントの太さ```Bold```、上パディング```24dp```、下パディング```8dp```に設定します。
> 3. 2つ目の```Text```コンポーザブルを、フォント```16sp```に設定します。

[該当リンク](https://developer.android.com/codelabs/basic-android-kotlin-compose-composables-practice-problems?hl=ja&continue=https%3A%2F%2Fdeveloper.android.com%2Fcourses%2Fpathways%2Fandroid-basics-compose-unit-1-pathway-3%3Fhl%3Dja%23codelab-https%3A%2F%2Fdeveloper.android.com%2Fcodelabs%2Fbasic-android-kotlin-compose-composables-practice-problems#2)

## 完成したコード
```kotlin: MainActivity.kt
package com.example.taskmanager

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.example.taskmanager.ui.theme.TaskManagerTheme

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            TaskManagerTheme {
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    ComposableTaskManagerApp()
                }
            }
        }
    }
}


@Composable
fun ComposableTaskManagerApp() {
    TaskManager(
        completedMessage = stringResource(R.string.completed_text),
        praisedMessage = stringResource(R.string.praised_text),
        imagePainter = painterResource(R.drawable.ic_task_completed)
    )
}

@Composable
fun TaskManager(
    completedMessage: String,
    praisedMessage: String,
    imagePainter: Painter,
    modifier: Modifier = Modifier
) {
    Column(
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally,
        modifier = modifier
    ) {
        Image(
            painter = imagePainter,
            contentDescription = null
        )
        Text(
            text = completedMessage,
            fontWeight = FontWeight.Bold,
            modifier = Modifier.padding(top = 24.dp, bottom = 8.dp)
        )
        Text(
            text = praisedMessage,
            fontSize = 16.sp
        )
    }
}

@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
    TaskManagerTheme {
        ComposableTaskManagerApp()
    }
}



```

### 実装したなかでの工夫点やポイント

・工夫点
```MainActitivy```内にUI直接構造を記述することは、可読性・再利用性・保全性などの観点からよろしくないため、UI構造は```TaskManager()```という専用の関数として定義し、その親コンポーザブルである```ComposableTaskMangerApp()```で呼び出すようなコードを設計しました。

・ポイント
お題のメイン部分である、コンテンツを画面の垂直方向・水平方向に中央揃えで配置する方法として、```Column```コンポーザブルのパラメータに垂直方向の配置レイアウトを設定するための```verticalArrangement = Arrangement.Center```　と水平方向の配置レイアウトを設定するための```horizonAlignment = Alignment.CenterHorizontally``` をそれぞれ設定しました。