Androidアプリ1月目の練習成果

## 参考書 
・Androidアプリ開発の教科書Kotlin対応
・Kotlinスタートブック

## 作成しているアプリ
Androidアプリの勉強で今は、出勤管理アプリを作成しています。

## 今後
・Fragmentの使い方を学ぶ。現状使っていない。
・DB接続にRoomを用いているが、ViewModelは用いていないので、使う。
・お試しのため、画面からデータを取得しておらず、直接挿入している、画面かた取得して挿入するようにする。
・取得したデータが画面に表示さない。

## アドバイス助言お待ちしてます。
データ取得したリストがなぜ画面に表示できないか教えてください

## 現状できているコード

```ruby:MainActivity.kt
class MainActivity : AppCompatActivity() {

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

        //時刻取得
        val date = Date()
        val format = SimpleDateFormat("yyyy/MM/dd HH:mm:ss", Locale.getDefault())
        val input = findViewById<TextView>(R.id.nowTime)
        input.text = format.format(date)

        //退勤ボタンオブジェクト取得
        val btLeave = findViewById<Button>(R.id.btLeave)
        //出勤ボタンオブジェクト取得
        val btAttendance = findViewById<Button>(R.id.btAttendance)
        //実績ボタンオブジェクト取得
        val buttonResult = findViewById<Button>(R.id.btResult)
    }

    override fun onStart() {
        super.onStart()
    }

    override fun onResume() {
        super.onResume()
    }

    //退勤ボタンがタップされた時の処理メソッド
    fun onLeaveClick(view: View){
        //timeオブジェクト取得
        val timer = findViewById<Chronometer>(R.id.chronometer)

        //resultTimeオブジェクト取得
        val resulttime = findViewById<TextView>(R.id.resultTime)
        resulttime.setText(timer.text.toString())
        timer.stop()
        //出勤ボタン押せるようにする
        btAttendance.isEnabled = true
        //退勤ボタン押せないようにすうる
        btLeave.isEnabled = false
    }

    //出勤ボタンがタップされた時の処理メソッド
    fun onAttendanceClick(view: View){
        //退勤ボタン押せるようにする
        btLeave.isEnabled = true
        //timeオブジェクト取得
        val timer = findViewById<Chronometer>(R.id.chronometer)
        //退勤ボタンを押せるようにする
        btLeave.isEnabled = true
        //出勤ボタン押せるようにする
        btAttendance.isEnabled = false
        //timeスタート
        timer.start()
    }

    //実績ボタンを押したら実績ページに遷移する
    fun onResultClick(view: View){
        //インテントオブジェクトを生成
        val intent = Intent(applicationContext, ResultActivity::class.java)
        //画面遷移
        startActivity(intent)
    }

    override fun onDestroy() {
        super.onDestroy()
    }
}
    }
}
```
ResultActivityでデータ取得を行います。

```ruby:ResultActivity.kt
class ResultActivity : AppCompatActivity() {
    companion object {
        lateinit var database: ResultRoomDatabase
    }
    data class ViewHolder(val resultView: ListView)

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

        //戻るオブジェクト取得
        val btBack = findViewById<Button>(R.id.btBack)
    }

   override fun onResume(){
        super.onResume()

        //ListViewオブジェクト作成
        val result = findViewById<ListView>(R.id.result)
        
        database = Room.databaseBuilder(this, ResultRoomDatabase::class.java, "kotlin_room_sumple.db").build()

        GlobalScope.launch(Dispatchers.Main) {
            val dao = database.resultDao()
            dao.delete(Result(40, "09:00", "17:30", 8, "2020/01/23", 2))
            dao.insertAll(Result(40, "09:00", "17:30", 8, "2020/01/23", 2))
            val id = dao.getId()
            val arrayAdapter: ArrayAdapter<Result> =
                ArrayAdapter(this@ResultActivity, android.R.layout.simple_list_item_1, id)

            result.adapter = arrayAdapter
        }
    }
 
　　fun onBack(view: View){
        finish()
    }

    override fun onDestroy() {
        super.onDestroy()
    }
}
```

```ruby:ResultDao.kt
@Dao
interface ResultDao {
    @Query("select * from result")
    suspend fun getAll(): List<Result>
    @Insert
    suspend fun insertAll(results: Result)
    @Delete
    suspend fun delete(result: Result)
    @Query("select version from result")
    suspend fun getId(): Int
}
```
```ruby:Result.kt
@Entity(tableName = "result")
data class Result (
    @PrimaryKey val uid: Int,
    @ColumnInfo(name = "start-time") val startTime: String?,
    @ColumnInfo(name = "end-time") val endTime: String?,
    @ColumnInfo(name = "time") val time: Int?,
    @ColumnInfo(name = "date") val date: String?,
    @ColumnInfo(name = "version") val version: Int
)
```
```ruby:AppDatabase.kt
@Database(entities = arrayOf(Result::class), version = 1, exportSchema = false)
    public abstract class ResultRoomDatabase : RoomDatabase(){
    abstract fun resultDao(): ResultDao

    companion object {
        @Volatile
        private var INSTANCE: ResultRoomDatabase? = null

        fun getDatabase(context: Context): ResultRoomDatabase{
            val tempInstance = INSTANCE
            if(tempInstance != null){
                return tempInstance
            }
            @UseExperimental(kotlinx.coroutines.InternalCoroutinesApi::class)
            synchronized(this) {
                val instance = Room.databaseBuilder(
                    context.applicationContext,
                    ResultRoomDatabase::class.java,
                    "result_database").build()
                INSTANCE = instance
                return instance
            }
        }
    }
}
```
```result.xml
<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">

    <Button
        android:id="@+id/btBack"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="54dp"
        android:layout_marginBottom="42dp"
        android:onClick="onBack"
        android:text="@string/bt_back"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="29dp"
        android:layout_marginTop="24dp"
        android:text="今月の勤怠"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ListView
        android:id="@+id/result"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="132dp"
        android:layout_marginBottom="90dp"
        app:layout_constraintBottom_toTopOf="@+id/btBack"
        app:layout_constraintTop_toBottomOf="@+id/textView"
        android:textSize="40dp"
        android:layout_weight = "0.6"/>
</androidx.constraintlayout.widget.ConstraintLayout>
```
```ruby:activity_main.xml
<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">


    <TextView
        android:id="@+id/nowTime"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:layout_marginEnd="35dp"
        android:text="@string/nowTime"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Chronometer
        android:id="@+id/chronometer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="182dp"
        android:layout_marginTop="206dp"
        android:layout_marginEnd="182dp"
        android:text="@string/chronometerText"
        android:textSize="36sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btLeave"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="30dp"
        android:layout_marginTop="200dp"
        android:text="@string/bt_leave"
        app:layout_constraintEnd_toStartOf="@+id/btResult"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/btAttendance"
        app:layout_constraintTop_toBottomOf="@+id/chronometer"
        android:onClick="onLeaveClick"
        android:enabled="false"/>

    <Button
        android:id="@+id/btAttendance"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="200dp"
        android:onClick="onAttendanceClick"
        android:text="@string/bt_attendance"
        app:layout_constraintEnd_toStartOf="@+id/btLeave"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintHorizontal_chainStyle="spread_inside"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/chronometer" />

    <Button
        android:id="@+id/btResult"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="30dp"
        android:layout_marginTop="200dp"
        android:layout_marginEnd="71dp"
        android:text="@string/bt_result"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/btLeave"
        app:layout_constraintTop_toBottomOf="@+id/chronometer"
        android:onClick="onResultClick"/>

    <Button
        android:id="@+id/btRest"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="41dp"
        android:text="@string/bt_rest"
        app:layout_constraintEnd_toStartOf="@+id/btClear"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/btAttendance"
        android:onClick="onResultViewClick"/>

    <Button
        android:id="@+id/btClear"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="30dp"
        android:layout_marginTop="41dp"
        android:text="@string/bt_clear"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/btRest"
        app:layout_constraintTop_toBottomOf="@+id/btLeave" />

    <TextView
        android:id="@+id/resultTime"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="32dp"
        android:layout_marginTop="131dp"
        android:text="@string/resultTimeText"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/resultView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="44dp"
        android:layout_marginTop="86dp"
        android:text="@string/resultText"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/resultTime" />
</androidx.constraintlayout.widget.ConstraintLayout>
```
## 実機操作
![sam.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268106/d3e809b3-77ac-e475-7af4-583506214069.gif)