package ドメイン.bmicalcimport android.content.Intentimport androidx.appcompat.app.AppCompatActivityimport android.os.Bundleimport android.view.Viewimport kotlinx.android.synthetic.main.activity_main.*class MainActivity : AppCompatActivity() { companion object { const val EXTRA_HEIGHT = "height" const val EXTRA_WEIGHT = "weight" } private val btnCalcListener = View.OnClickListener { var isValid = true val textHeight = edtHeight.text.toString() val textWeight = edtWeight.text.toString() if (textHeight.isEmpty()) { edtHeight.error = getString(R.string.error_height) isValid = false } if (textWeight.isEmpty()) { edtWeight.error = getString(R.string.error_weight) isValid = false } if (isValid) { val height = textHeight.toFloat() val weight = textWeight.toFloat() val intent = Intent(this, ResultActivity::class.java).apply { putExtra(EXTRA_HEIGHT, height) putExtra(EXTRA_WEIGHT, weight) } startActivity(intent) } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) btnCalc.setOnClickListener(btnCalcListener) }}package ドメイン.bmicalcimport androidx.appcompat.app.AppCompatActivityimport android.os.Bundleimport kotlinx.android.synthetic.main.activity_result.*class ResultActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_result) val height = intent.getFloatExtra(MainActivity.EXTRA_HEIGHT, 0.0f) val weight = intent.getFloatExtra(MainActivity.EXTRA_WEIGHT, 0.0f) txtInput.text = getString(R.string.input_label, height, weight) BMIRange.performBmiCalculation(height / 100, weight).run { val bmi = first val bmiStart = second.range.start val bmiEnd = second.range.endInclusive val score = getString(second.scoreResourcesId) val properWeight = third val weightDiff = weight - properWeight txtResultBmi.text = when (bmiEnd == Float.MAX_VALUE) { true -> getString(R.string.bmi_label_max, bmi, bmiStart, score) else -> getString(R.string.bmi_label, bmi, bmiStart, bmiEnd, score) } txtResultProper.text = getString(R.string.proper_label, properWeight, weightDiff) } }}package ドメイン.bmicalcimport kotlin.math.pow@Suppress("unused")enum class BMIRange( val range: ClosedFloatingPointRange<Float>, val scoreResourcesId: Int) { TOO_SKINNY(0.00f..15.99f, R.string.too_skinny_label), THIN(16.00f..16.99f, R.string.thin_label), THINNESS(17.00f..18.49f, R.string.thinness_label), NORMAL_WEIGHT(18.50f..24.99f, R.string.normal_weight_label), PRE_OBESITY(25.00f..29.99f, R.string.pre_obesity_label), OBESITY_1(30.00f..34.99f, R.string.obesity1_label), OBESITY_2(35.00f..39.99f, R.string.obesity2_label), OBESITY_3(40.00f..Float.MAX_VALUE, R.string.obesity3_label); companion object { /** * BMI の計算を行う * @param height 身長(メートル) * @param weight 体重(キログラム) * @return Triple<Float, BMIRange, Float> first: bmi 値, second: BMIRange(Enum 型), third: 適正体重 */ fun performBmiCalculation(height: Float, weight: Float): Triple<Float, BMIRange, Float> { val bmi = weight / height.pow(2) val properWeight = height.pow(2) * 22 val bmiRange = values().find { bmi in it.range } ?: OBESITY_3 return Triple(bmi, bmiRange, properWeight) } }}<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <EditText android:id="@+id/edtHeight" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginEnd="48dp" android:layout_marginBottom="32dp" android:ems="10" android:hint="@string/height_hint" android:inputType="numberDecimal" app:layout_constraintBottom_toTopOf="@+id/edtWeight" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/textView" android:importantForAutofill="no" /> <TextView android:id="@+id/textView" android:layout_width="0dp" android:layout_height="wrap_content" android:text="@string/height_label" android:textAppearance="@style/TextAppearance.AppCompat.Large" app:layout_constraintBaseline_toBaselineOf="@+id/edtHeight" app:layout_constraintEnd_toEndOf="@+id/textView2" app:layout_constraintStart_toStartOf="@+id/textView2" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="48dp" android:text="@string/weight_label" android:textAppearance="@style/TextAppearance.AppCompat.Large" app:layout_constraintBaseline_toBaselineOf="@+id/edtWeight" app:layout_constraintStart_toStartOf="parent" /> <EditText android:id="@+id/edtWeight" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginEnd="48dp" android:layout_marginBottom="24dp" android:ems="10" android:hint="@string/weight_hint" android:inputType="numberDecimal" app:layout_constraintBottom_toTopOf="@+id/guideline" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/textView2" android:importantForAutofill="no" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent=".5" /> <Button android:id="@+id/btnCalc" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:layout_marginEnd="48dp" android:text="@string/calculate_button" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@+id/guideline" /></androidx.constraintlayout.widget.ConstraintLayout><?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <EditText android:id="@+id/edtHeight" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="24dp" android:layout_marginEnd="8dp" android:ems="10" android:hint="@string/height_hint" android:importantForAutofill="no" android:inputType="numberDecimal" app:layout_constraintEnd_toStartOf="@+id/btnCalc" app:layout_constraintStart_toStartOf="@+id/guideline" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/textView" android:layout_width="0dp" android:layout_height="wrap_content" android:text="@string/height_label" android:textAppearance="@style/TextAppearance.AppCompat.Large" app:layout_constraintBaseline_toBaselineOf="@+id/edtHeight" app:layout_constraintEnd_toEndOf="@+id/textView2" app:layout_constraintStart_toStartOf="@+id/textView2" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dp" android:text="@string/weight_label" android:textAppearance="@style/TextAppearance.AppCompat.Large" app:layout_constraintBaseline_toBaselineOf="@+id/edtWeight" app:layout_constraintEnd_toStartOf="@+id/guideline" /> <EditText android:id="@+id/edtWeight" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="32dp" android:layout_marginEnd="8dp" android:ems="10" android:hint="@string/weight_hint" android:importantForAutofill="no" android:inputType="numberDecimal" app:layout_constraintEnd_toStartOf="@+id/btnCalc" app:layout_constraintStart_toStartOf="@+id/guideline" app:layout_constraintTop_toBottomOf="@+id/edtHeight" /> <Button android:id="@+id/btnCalc" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:layout_marginEnd="48dp" android:text="@string/calculate_button" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/edtWeight" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_percent=".3" /></androidx.constraintlayout.widget.ConstraintLayout><?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".ResultActivity"> <TextView android:id="@+id/txtInput" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginBottom="48dp" android:text="@string/input_label" android:textAppearance="@style/TextAppearance.AppCompat.Medium" app:layout_constraintBottom_toTopOf="@+id/txtResultBmi" app:layout_constraintStart_toStartOf="parent" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent=".5" /> <TextView android:id="@+id/txtResultBmi" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginEnd="8dp" android:layout_marginBottom="24dp" android:text="@string/bmi_label" android:textAppearance="@style/TextAppearance.AppCompat.Large" app:layout_constraintBottom_toTopOf="@+id/guideline2" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" /> <TextView android:id="@+id/txtResultProper" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="24dp" android:layout_marginEnd="8dp" android:text="@string/proper_label" android:textAppearance="@style/TextAppearance.AppCompat.Large" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@+id/guideline2" /></androidx.constraintlayout.widget.ConstraintLayout><resources> <string name="app_name">BMI Calculator</string> <string name="input_label">%1.1fcm, %2.1fkg BMI is</string> <string name="bmi_label">%1.2f (%2.2f-%3.2f %4s)</string> <string name="proper_label">The proper weight is %1.1fkg (%+2.2fkg)</string> <string name="too_skinny_label">too skinny</string> <string name="thin_label">Thin</string> <string name="thinness_label">Thinness</string> <string name="normal_weight_label">Normal weight</string> <string name="pre_obesity_label">Pre-obesity</string> <string name="obesity1_label">Obesity (1 degree)</string> <string name="obesity2_label">Obesity (twice)</string> <string name="obesity3_label">Obesity (3 degree)</string> <string name="height_hint" translatable="false">cm</string> <string name="height_label">height</string> <string name="weight_label">weight</string> <string name="weight_hint" translatable="false">kg</string> <string name="calculate_button">Calculate</string> <string name="error_height">Please input HEIGHT.</string> <string name="error_weight">Please input WEIGHT.</string> <string name="bmi_label_max">%1.2f (over %2.2f %3s)</string></resources><?xml version="1.0" encoding="utf-8"?><resources> <string name="app_name">BMI 計算機</string> <string name="bmi_label">%1.2f (%2.2f-%3.2f %4s) です</string> <string name="input_label">%1.1fcm、%2.1fkg の BMI は</string> <string name="normal_weight_label">普通体重</string> <string name="obesity1_label">肥満 (1度)</string> <string name="obesity2_label">肥満 (2度)</string> <string name="obesity3_label">肥満 (3度)</string> <string name="pre_obesity_label">前肥満</string> <string name="proper_label">標準体重は %1.1fkg (%+2.2fkg) です</string> <string name="thin_label">痩せ</string> <string name="too_skinny_label">痩せすぎ</string> <string name="thinness_label">痩せぎみ</string> <string name="calculate_button">計算する</string> <string name="height_label">身長</string> <string name="weight_label">体重</string> <string name="error_height">身長を入力してください</string> <string name="error_weight">体重を入力してください</string> <string name="bmi_label_max">%1.2f (%2.2f以上 %3s) です</string></resources>package ドメイン.rpsappimport android.content.Intentimport androidx.appcompat.app.AppCompatActivityimport android.os.Bundleimport android.view.Viewimport kotlinx.android.synthetic.main.activity_main.*import kotlin.random.Randomclass MainActivity : AppCompatActivity() { private lateinit var winRate: ArrayList<Int> private val handBtnClickListener = View.OnClickListener { view -> val playerHand = when (view.id) { R.id.btnRock -> ROCK R.id.btnPaper -> PAPER else -> SCISSORS } val cpuHand = generateRandomHand() val result = judgement(playerHand, cpuHand) winRate.add(result) val intent = Intent().apply { putExtra(EXTRA_WIN_RATE, winRate) } when (result) { EVEN -> intent.setClass(this, this::class.java) .flags = Intent.FLAG_ACTIVITY_CLEAR_TOP else -> intent.setClass(this, ResultActivity::class.java) .putExtra(EXTRA_PLAYER, playerHand) .putExtra(EXTRA_CPU, cpuHand) .putExtra(EXTRA_RESULT, result) } startActivity(intent) } private fun judgement(playerHand: Int, cpuHand: Int): Int = (playerHand - cpuHand + 3) % 3 private fun generateRandomHand(): Int = Random.nextInt(3) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) winRate = intent.getSerializableExtra(EXTRA_WIN_RATE)?.asArrayOfType() ?: arrayListOf() for (button in listOf(btnRock, btnPaper, btnScissors)) { button.setOnClickListener(handBtnClickListener) } btnRate.setOnClickListener { rateButtonClicked(this, winRate) } }}package ドメイン.rpsappimport androidx.appcompat.app.AppCompatActivityimport android.os.Bundleimport android.widget.ImageViewimport kotlinx.android.synthetic.main.activity_result.*class ResultActivity : AppCompatActivity() { private lateinit var winRate: ArrayList<Int> private fun ImageView.setImg(hand: Int) = this.setImageResource( when (hand) { ROCK -> R.drawable.rock PAPER -> R.drawable.paper else -> R.drawable.scissors } ) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_result) winRate = intent.getSerializableExtra(EXTRA_WIN_RATE).asArrayOfType() val playerHand = intent.getIntExtra(EXTRA_PLAYER, -1) val cpuHand = intent.getIntExtra(EXTRA_CPU, -1) val result = intent.getIntExtra(EXTRA_RESULT, -1) if (listOf(playerHand, cpuHand, result).all { it == -1 }) finish() when (result) { EVEN -> finish() else -> { txtResult.text = getString(if (result == WIN) R.string.win_message else R.string.lose_message) imgPlayer.setImg(playerHand) imgCpu.setImg(cpuHand) } } btnRate.setOnClickListener { rateButtonClicked(this, winRate) } btnRematch.setOnClickListener { rematch(this, winRate) } } override fun onBackPressed() {// super.onBackPressed() rematch(this, winRate) }}package ドメイン.rpsappimport androidx.appcompat.app.AppCompatActivityimport android.os.Bundleimport kotlinx.android.synthetic.main.activity_win_rate.*class WinRateActivity : AppCompatActivity() { private lateinit var winRate: ArrayList<Int> override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_win_rate) winRate = intent.getSerializableExtra(EXTRA_WIN_RATE).asArrayOfType() val size = winRate.size.toFloat() // index of … // 0: EVEN, 1: LOSE, 2: WIN val count = IntArray(3) winRate.forEach { count[it]++ } txtWinRate.text = getString(R.string.win_rate, count[WIN] / size * 100) txtLoseRate.text = getString(R.string.lose_rate, count[LOSE] / size * 100) txtDrawRate.text = getString(R.string.draw_rate, count[EVEN] / size * 100) btnRematch.setOnClickListener { rematch(this, winRate) } } override fun onBackPressed() {// super.onBackPressed() rematch(this, winRate) }}package ドメイン.rpsappimport android.content.Intentimport androidx.appcompat.app.AppCompatActivityimport java.io.Serializableconst val ROCK = 0const val PAPER = 2const val SCISSORS = 1const val EVEN = 0const val WIN = 2const val LOSE = 1const val EXTRA_PLAYER = "player_hand"const val EXTRA_CPU = "cpu_hand"const val EXTRA_RESULT = "result"const val EXTRA_WIN_RATE = "win_rate"/** * シリアライズ化された ArrayList<T> をキャスト(デシリアライズ)する * @return キャスト(デシリアライズ)した ArrayList<T> */@Suppress("UNCHECKED_CAST")inline fun <reified T> Serializable?.asArrayOfType(): ArrayList<T> = if (this != null && this is ArrayList<*> && this.all { it is T }) { this as ArrayList<T> } else { throw ClassCastException("Could not be cast \"ArrayList<${T::class.java}>\"") }/** * 「戻る」ボタン、または「rematch」ボタンをタップした時の画面遷移処理 * @param activity 遷移元 Activity * @param winRate 勝率情報 */fun rematch(activity: AppCompatActivity, winRate: ArrayList<Int>) { val intent = Intent(activity, MainActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_CLEAR_TOP putExtra(EXTRA_WIN_RATE, winRate) } activity.startActivity(intent)}/** * 「rate」ボタンをタップした時の画面遷移処理 * @param activity 遷移元 Activity * @param winRate 勝率情報 */fun rateButtonClicked(activity: AppCompatActivity, winRate: ArrayList<Int>) { val intent = Intent(activity, WinRateActivity::class.java).apply { putExtra(EXTRA_WIN_RATE, winRate) } activity.startActivity(intent)}package ドメイン.taskmanagerimport android.app.Activityimport android.content.Intentimport androidx.appcompat.app.AppCompatActivityimport android.os.Bundleimport android.view.Viewimport kotlinx.android.synthetic.main.activity_add_task.*class AddTaskActivity : AppCompatActivity() { private val okBtnClickListener = View.OnClickListener { if (inputCheck(this, txtTitle, txtDate, txtTime)) { setResult(Activity.RESULT_OK, Intent().apply { putExtra(EXTRA_TASK, generateTask()) }) finish() } } private val cancelBtnClickListener = View.OnClickListener { setResult(Activity.RESULT_CANCELED) finish() } /** * タスクを生成する * @return task */ private fun generateTask() = Task.newInstance( txtTitle.text.toString(), txtDate.text.toString(), txtTime.text.toString(), Priority.getPriority(priorityGroup.checkedRadioButtonId), txtDetail.text.toString() ) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_add_task) setResult(Activity.RESULT_CANCELED) btnOK.setOnClickListener(okBtnClickListener) btnCancel.setOnClickListener(cancelBtnClickListener) }}@file:Suppress("unused")package ドメイン.taskmanagerenum class Priority( val code: Int, val resourcesId: Int, val label: String) { IMMEDIATELY(0, R.id.rdoImmediately, "!!!"), ASAP(1, R.id.rdoAsap, "!!"), SOON(2, R.id.rdoSoon, "!"), ANYTIME(3, R.id.rdoAnytime, " "); companion object { fun getPriority(resourcesId: Int) = values().find { resourcesId == it.resourcesId }?.code ?: ANYTIME.code fun getLabel(code: Int) = values().find { code == it.code }?.label ?: ANYTIME.label fun getResourcesId(code: Int) = values().find { code == it.code }?.resourcesId ?: ANYTIME.code }}@file:Suppress("NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS")package ドメイン.taskmanagerimport java.io.Serializableimport java.text.SimpleDateFormatimport java.util.*import java.util.UUID.randomUUIDdata class Task( val title: String,// val date: String,// val time: String, val date: Date, val priority: Int, val detail: String) : Serializable { val uuid = initUuid() companion object { private const val DATE_FORMAT = "MM/dd HH:mm" /** * Task インスタンスを生成するファクトリメソッド * @param title タイトル * @param date 日付 * @param time 時間 * @param priority 優先度 * @param detail 詳細 * @return Task インスタンス */ fun newInstance( title: String, date: String, time: String, priority: Int, detail: String ) = Task(title, generateDate(date, time), priority, detail) /** * 文字列(日付, 時間)から Date 型の値を生成する * @param date 日付 * @param time 時間 * @return 現在年の Date */ private fun generateDate(date: String, time: String): Date { val format = SimpleDateFormat(DATE_FORMAT, Locale.getDefault()) return format.parse("$date $time") } } /** * Generate unique ID from UUID in positive space * Reference: https://gist.github.com/umbertogriffo/956f3dacc7fbeee0b65a264e8b003044 * @return long value representing UUID */ private fun initUuid(): Long { var value: Long do { value = randomUUID().mostSignificantBits and Long.MAX_VALUE } while (value < 0) return value }}package ドメイン.taskmanagerimport android.app.Activityimport android.content.Intentimport androidx.appcompat.app.AppCompatActivityimport android.os.Bundleimport android.view.Viewimport kotlinx.android.synthetic.main.activity_task_detail.*class TaskDetailActivity : AppCompatActivity() { private lateinit var beforeTask: Task private val deleteBtnClickListener = View.OnClickListener { setResult(Activity.RESULT_OK, Intent().apply { putExtra(EXTRA_TASK, beforeTask) }) finish() } private val changeBtnClickListener = View.OnClickListener { if (inputCheck(this, txtTitle, txtDate, txtTime)) { setResult(Activity.RESULT_FIRST_USER, Intent().apply { putExtra(EXTRA_TASK, beforeTask) putExtra(EXTRA_CHANGE_TASK, generateTask()) }) finish() } } private val cancelBtnListener = View.OnClickListener { setResult(Activity.RESULT_CANCELED) finish() } /** * view の初期化を行う * @param task 詳細を表示するタスク */ private fun initViews(task: Task) { txtTitle.setText(task.title)// txtDate.setText(task.date)// txtTime.setText(task.time) txtDate.setText(task.date.toDate()) txtTime.setText(task.date.toTime()) priorityGroup.check(Priority.getResourcesId(task.priority)) txtDetail.setText(task.detail) } /** * タスクを生成する * @return task */ private fun generateTask() = Task.newInstance( txtTitle.text.toString(), txtDate.text.toString(), txtTime.text.toString(), Priority.getPriority(priorityGroup.checkedRadioButtonId), txtDetail.text.toString() ) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_task_detail) setResult(Activity.RESULT_CANCELED) beforeTask = intent.getSerializableExtra(EXTRA_TASK) as Task initViews(beforeTask) btnDelete.setOnClickListener(deleteBtnClickListener) btnChange.setOnClickListener(changeBtnClickListener) btnCancel.setOnClickListener(cancelBtnListener) }}package ドメイン.taskmanagerimport android.content.Contextimport android.view.LayoutInflaterimport android.view.Viewimport android.view.ViewGroupimport android.widget.BaseAdapterimport android.widget.TextViewclass TaskListAdapter( private val context: Context, private val tasks: List<Task>) : BaseAdapter() { override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View = (convertView ?: createView(parent)).apply { getItem(position).also { task -> (tag as ViewHolder).run { initViews(this, task) } } } override fun getItem(position: Int) = tasks[position] override fun getItemId(position: Int) = tasks[position].uuid override fun getCount() = tasks.size /** * listItem 内の view を初期化する * @param viewHolder item の id 情報が格納された viewHolder * @param task 初期化内容のタスク */ private fun initViews(viewHolder: ViewHolder, task: Task) { viewHolder.run { title.text = task.title// date.text = task.date// time.text = task.time date.text = task.date.toDate() time.text = task.date.toTime() priority.text = Priority.getLabel(task.priority) } } private fun createView(parent: ViewGroup?) = LayoutInflater.from(context).inflate(R.layout.tasklist_item_row, parent, false).apply { tag = ViewHolder(this) } class ViewHolder(view: View) { val title: TextView = view.findViewById(R.id.txtTitle) val date: TextView = view.findViewById(R.id.txtDate) val time: TextView = view.findViewById(R.id.txtTime) val priority: TextView = view.findViewById(R.id.txtPriority) }}package ドメイン.taskmanagerimport android.app.Activityimport android.content.Contextimport android.content.Intentimport android.content.SharedPreferencesimport androidx.appcompat.app.AppCompatActivityimport android.os.Bundleimport android.util.Logimport android.view.Viewimport android.widget.AdapterViewimport com.google.gson.Gsonimport kotlinx.android.synthetic.main.activity_main.*class TaskManagerActivity : AppCompatActivity() { private lateinit var preferences: SharedPreferences private val addBtnClickListener = View.OnClickListener { startActivityForResult(Intent(this, AddTaskActivity::class.java), REQUEST_CODE_ADD) } private val taskItemClickListener = AdapterView.OnItemClickListener { parent, _, position, _ -> val task = (parent.adapter as TaskListAdapter).getItem(position) val intent = Intent(this, TaskDetailActivity::class.java).apply { putExtra(EXTRA_TASK, task) } startActivityForResult(intent, REQUEST_CODE_DETAIL) } private fun showTasks() { val tasks = preferences.getString(PREF_TASKS_KEY, null) if (tasks != null) taskListView.adapter = TaskListAdapter(this, tasks.fromJson().sort()) } private fun List<Task>.sort() = this.sortedWith(compareBy({ it.date }, { it.priority })) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) preferences = getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE) btnAdd.setOnClickListener(addBtnClickListener) taskListView.onItemClickListener = taskItemClickListener showTasks() } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (resultCode != Activity.RESULT_CANCELED && data != null) { val task = data.getSerializableExtra(EXTRA_TASK) as Task val json = preferences.getString(PREF_TASKS_KEY, null) val tasks = json?.fromJson() ?: mutableListOf() when (requestCode) { REQUEST_CODE_ADD -> tasks.add(task) REQUEST_CODE_DETAIL -> { tasks.remove(task) if (resultCode == Activity.RESULT_FIRST_USER) { tasks.add((data.getSerializableExtra(EXTRA_CHANGE_TASK) as Task)) } } } preferences.edit().putString(PREF_TASKS_KEY, tasks.toJson()).apply() showTasks() } }}package ドメイン.taskmanagerimport android.content.Contextimport android.widget.EditTextimport com.google.gson.Gsonimport com.google.gson.reflect.TypeTokenimport java.text.ParseExceptionimport java.text.SimpleDateFormatimport java.util.*const val REQUEST_CODE_ADD = 1const val REQUEST_CODE_DETAIL = 2const val PREF_NAME = "taskList"const val PREF_TASKS_KEY = "tasks"const val EXTRA_TASK = "task"const val EXTRA_CHANGE_TASK = "change_task"private const val DATE_FORMAT = "MM/dd"private const val TIME_FORMAT = "HH:mm"/** * Date 型の値を文字列に変換する * @return 文字列の日付 */fun Date.toDate(): String = SimpleDateFormat(DATE_FORMAT, Locale.getDefault()).format(this)/** * Date 型の値を文字列に変換する * @return 文字列の時間 */fun Date.toTime(): String = SimpleDateFormat(TIME_FORMAT, Locale.getDefault()).format(this)/** * 入力値チェックとエラー表示処理を行う * @param context Context 情報 * @param title タイトル入力用の EditText * @param date 日付入力用の EditText * @param time 時間入力用の EditText * @return 判定結果 true: エラーなし, false: エラーあり */fun inputCheck(context: Context, title: EditText, date: EditText, time: EditText): Boolean { // title の判定 val isNotEmpty = if (title.text.toString().isNotEmpty()) { true } else { title.error = context.getString(R.string.title_error) false } // date の判定 val dateIsValid = try { SimpleDateFormat(DATE_FORMAT, Locale.getDefault()).parse(date.text.toString()) true } catch (e: ParseException) { date.error = context.getString(R.string.date_error) false } // time の判定 val timeIsValid = try { SimpleDateFormat(TIME_FORMAT, Locale.getDefault()).parse(time.text.toString()) true } catch (e: ParseException) { time.error = context.getString(R.string.time_error) false } return isNotEmpty && dateIsValid && timeIsValid}/** * リスト内容を JSON に変換する * @return JSON(String) */fun List<Task>.toJson(): String = Gson().toJson(this)/** * JSON からリストインスタンスを生成する * @return タスクリスト(MutableList<Task>) */fun String.fromJson(): MutableList<Task> = Gson().fromJson(this, object : TypeToken<MutableList<Task>>() {}.type)<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".TaskManagerActivity"> <Button android:id="@+id/btnAdd" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:text="@string/add_button" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> <ListView android:id="@+id/taskListView" android:layout_width="0dp" android:layout_height="0dp" android:layout_marginTop="8dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/btnAdd" tools:listitem="@layout/tasklist_item_row" /></androidx.constraintlayout.widget.ConstraintLayout><?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".AddTaskActivity"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:text="@string/priority_title" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/txtTime" /> <EditText android:id="@+id/txtTitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:ems="10" android:hint="@string/title_hint" android:inputType="textPersonName" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" android:importantForAutofill="no" /> <EditText android:id="@+id/txtDate" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:ems="10" android:hint="@string/date_hint" android:inputType="date" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/txtTitle" android:importantForAutofill="no" /> <EditText android:id="@+id/txtTime" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:ems="10" android:hint="@string/time_hint" android:inputType="time" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/txtDate" android:importantForAutofill="no" /> <RadioGroup android:id="@+id/priorityGroup" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginEnd="8dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView"> <RadioButton android:id="@+id/rdoImmediately" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/priority_immediately" /> <RadioButton android:id="@+id/rdoAsap" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/priority_asap" /> <RadioButton android:id="@+id/rdoSoon" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/priority_soon" /> <RadioButton android:id="@+id/rdoAnytime" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/priority_anytime" android:checked="true"/> </RadioGroup> <EditText android:id="@+id/txtDetail" android:layout_width="0dp" android:layout_height="0dp" android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:layout_marginBottom="8dp" android:ems="10" android:gravity="start|top" android:hint="@string/task_detail_hint" android:importantForAutofill="no" android:inputType="textMultiLine" app:layout_constraintBottom_toTopOf="@+id/btnCancel" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/priorityGroup" /> <Button android:id="@+id/btnCancel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginEnd="4dp" android:layout_marginBottom="8dp" android:text="@android:string/cancel" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/btnOK" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" /> <Button android:id="@+id/btnOK" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="4dp" android:layout_marginEnd="8dp" android:text="@android:string/ok" app:layout_constraintBaseline_toBaselineOf="@+id/btnCancel" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/btnCancel" /></androidx.constraintlayout.widget.ConstraintLayout><?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".AddTaskActivity"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:text="@string/priority_title" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/txtTime" /> <EditText android:id="@+id/txtTitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="4dp" android:ems="10" android:hint="@string/title_hint" android:importantForAutofill="no" android:inputType="textPersonName" app:layout_constraintEnd_toStartOf="@+id/guideline" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <EditText android:id="@+id/txtDate" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="4dp" android:ems="10" android:hint="@string/date_hint" android:importantForAutofill="no" android:inputType="date" app:layout_constraintEnd_toStartOf="@+id/txtTime" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/txtTitle" /> <EditText android:id="@+id/txtTime" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="4dp" android:layout_marginEnd="4dp" android:ems="10" android:hint="@string/time_hint" android:importantForAutofill="no" android:inputType="time" app:layout_constraintBaseline_toBaselineOf="@+id/txtDate" app:layout_constraintEnd_toStartOf="@+id/guideline" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/txtDate" /> <RadioGroup android:id="@+id/priorityGroup" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginEnd="4dp" app:layout_constraintEnd_toStartOf="@+id/guideline" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView"> <RadioButton android:id="@+id/rdoImmediately" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/priority_immediately" /> <RadioButton android:id="@+id/rdoAsap" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/priority_asap" /> <RadioButton android:id="@+id/rdoSoon" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/priority_soon" /> <RadioButton android:id="@+id/rdoAnytime" android:layout_width="match_parent" android:layout_height="wrap_content" android:checked="true" android:text="@string/priority_anytime" /> </RadioGroup> <EditText android:id="@+id/txtDetail" android:layout_width="0dp" android:layout_height="0dp" android:layout_marginStart="4dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:layout_marginBottom="8dp" android:ems="10" android:gravity="start|top" android:hint="@string/task_detail_hint" android:importantForAutofill="no" android:inputType="textMultiLine" app:layout_constraintBottom_toTopOf="@+id/btnCancel" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="@+id/guideline" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/btnCancel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginEnd="4dp" android:layout_marginBottom="8dp" android:text="@android:string/cancel" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/btnOK" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" /> <Button android:id="@+id/btnOK" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="4dp" android:layout_marginEnd="8dp" android:text="@android:string/ok" app:layout_constraintBaseline_toBaselineOf="@+id/btnCancel" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/btnCancel" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_percent=".5" /></androidx.constraintlayout.widget.ConstraintLayout><?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".TaskDetailActivity"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:text="@string/priority_title" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/txtTime" /> <EditText android:id="@+id/txtTitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:ems="10" android:hint="@string/title_hint" android:importantForAutofill="no" android:inputType="textPersonName" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <EditText android:id="@+id/txtDate" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:ems="10" android:hint="@string/date_hint" android:importantForAutofill="no" android:inputType="date" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/txtTitle" /> <EditText android:id="@+id/txtTime" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:ems="10" android:hint="@string/time_hint" android:importantForAutofill="no" android:inputType="time" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/txtDate" /> <RadioGroup android:id="@+id/priorityGroup" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginEnd="8dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView"> <RadioButton android:id="@+id/rdoImmediately" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/priority_immediately" /> <RadioButton android:id="@+id/rdoAsap" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/priority_asap" /> <RadioButton android:id="@+id/rdoSoon" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/priority_soon" /> <RadioButton android:id="@+id/rdoAnytime" android:layout_width="match_parent" android:layout_height="wrap_content" android:checked="true" android:text="@string/priority_anytime" /> </RadioGroup> <EditText android:id="@+id/txtDetail" android:layout_width="0dp" android:layout_height="0dp" android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:layout_marginBottom="8dp" android:ems="10" android:gravity="start|top" android:hint="@string/task_detail_hint" android:importantForAutofill="no" android:inputType="textMultiLine" app:layout_constraintBottom_toTopOf="@+id/btnCancel" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/priorityGroup" /> <Button android:id="@+id/btnCancel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginEnd="4dp" android:layout_marginBottom="8dp" android:text="@android:string/cancel" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/btnChange" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" /> <Button android:id="@+id/btnDelete" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="4dp" android:layout_marginEnd="8dp" android:text="@string/delete_btn" app:layout_constraintBaseline_toBaselineOf="@+id/btnCancel" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/btnChange" /> <Button android:id="@+id/btnChange" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="4dp" android:layout_marginEnd="4dp" android:text="@string/change_btn" app:layout_constraintBaseline_toBaselineOf="@+id/btnCancel" app:layout_constraintEnd_toStartOf="@+id/btnDelete" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/btnCancel" /></androidx.constraintlayout.widget.ConstraintLayout><?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".TaskDetailActivity"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:text="@string/priority_title" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/txtTime" /> <EditText android:id="@+id/txtTitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="4dp" android:ems="10" android:hint="@string/title_hint" android:importantForAutofill="no" android:inputType="textPersonName" app:layout_constraintEnd_toStartOf="@+id/guideline2" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <EditText android:id="@+id/txtDate" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="4dp" android:ems="10" android:hint="@string/date_hint" android:importantForAutofill="no" android:inputType="date" app:layout_constraintEnd_toStartOf="@+id/txtTime" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/txtTitle" /> <EditText android:id="@+id/txtTime" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="4dp" android:layout_marginEnd="4dp" android:ems="10" android:hint="@string/time_hint" android:importantForAutofill="no" android:inputType="time" app:layout_constraintBaseline_toBaselineOf="@+id/txtDate" app:layout_constraintEnd_toStartOf="@+id/guideline2" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/txtDate" /> <RadioGroup android:id="@+id/priorityGroup" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginEnd="4dp" app:layout_constraintEnd_toStartOf="@+id/guideline2" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView"> <RadioButton android:id="@+id/rdoImmediately" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/priority_immediately" /> <RadioButton android:id="@+id/rdoAsap" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/priority_asap" /> <RadioButton android:id="@+id/rdoSoon" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/priority_soon" /> <RadioButton android:id="@+id/rdoAnytime" android:layout_width="match_parent" android:layout_height="wrap_content" android:checked="true" android:text="@string/priority_anytime" /> </RadioGroup> <EditText android:id="@+id/txtDetail" android:layout_width="0dp" android:layout_height="0dp" android:layout_marginStart="4dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:layout_marginBottom="8dp" android:ems="10" android:gravity="start|top" android:hint="@string/task_detail_hint" android:importantForAutofill="no" android:inputType="textMultiLine" app:layout_constraintBottom_toTopOf="@+id/btnCancel" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="@+id/guideline2" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/btnCancel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginEnd="4dp" android:layout_marginBottom="8dp" android:text="@android:string/cancel" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/btnChange" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" /> <Button android:id="@+id/btnDelete" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="4dp" android:layout_marginEnd="8dp" android:text="@string/delete_btn" app:layout_constraintBaseline_toBaselineOf="@+id/btnCancel" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/btnChange" /> <Button android:id="@+id/btnChange" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="4dp" android:layout_marginEnd="4dp" android:text="@string/change_btn" app:layout_constraintBaseline_toBaselineOf="@+id/btnCancel" app:layout_constraintEnd_toStartOf="@+id/btnDelete" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/btnCancel" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_percent=".5" /></androidx.constraintlayout.widget.ConstraintLayout><?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/txtDate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" app:layout_constraintBottom_toTopOf="@+id/txtTime" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" tools:text="2020/12/31" /> <TextView android:id="@+id/txtTime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dp" android:layout_marginBottom="8dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/txtDate" tools:text="23:59" /> <TextView android:id="@+id/txtPriority" android:layout_width="36dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:textSize="36sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" tools:text="!!!" /> <TextView android:id="@+id/txtTitle" android:layout_width="0dp" android:layout_height="wrap_content" android:textSize="36sp" app:layout_constraintBaseline_toBaselineOf="@+id/txtPriority" app:layout_constraintEnd_toStartOf="@+id/txtDate" app:layout_constraintStart_toEndOf="@+id/txtPriority" tools:text="Title" /></androidx.constraintlayout.widget.ConstraintLayout><resources> <string name="app_name" translatable="false">TaskManager</string> <string name="add_button" translatable="false">+</string> <string name="priority_title">Priority</string> <string name="title_hint">title</string> <string name="date_hint">date</string> <string name="time_hint">time</string> <string name="priority_immediately">Immediately</string> <string name="priority_asap">ASAP (as soon as possible)</string> <string name="priority_soon">Soon</string> <string name="priority_anytime">Anytime</string> <string name="task_detail_hint">task detail</string> <string name="change_btn">change</string> <string name="delete_btn">delete</string> <string name="title_error">Please enter title correctly</string> <string name="date_error">Please enter date correctly</string> <string name="time_error">Please enter time correctly</string></resources><?xml version="1.0" encoding="utf-8"?><resources> <string name="priority_title">優先度</string> <string name="title_hint">タイトル</string> <string name="date_hint">日付</string> <string name="time_hint">時間</string> <string name="priority_anytime">普通</string> <string name="priority_soon">すぐに</string> <string name="priority_asap">可及的速やかに</string> <string name="priority_immediately">緊急!</string> <string name="task_detail_hint">詳細</string> <string name="change_btn">変更</string> <string name="delete_btn">削除</string> <string name="date_error">日付を正しく入力してください</string> <string name="time_error">時間を正しく入力してください</string> <string name="title_error">タイトルを正しく入力してください</string></resources>