参考書
・Androidアプリ開発の教科書Kotlin対応
・Kotlinスタートブック
作成しているアプリ
Androidアプリの勉強で今は、出勤管理アプリを作成しています。
今後
・Fragmentの使い方を学ぶ。現状使っていない。
・DB接続にRoomを用いているが、ViewModelは用いていないので、使う。
・お試しのため、画面からデータを取得しておらず、直接挿入している、画面かた取得して挿入するようにする。
・取得したデータが画面に表示さない。
アドバイス助言お待ちしてます。
データ取得したリストがなぜ画面に表示できないか教えてください
現状できているコード
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でデータ取得を行います。
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()
}
}
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
}
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
)
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>
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>