Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ android {

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildFeatures {
viewBinding = true
}

buildTypes {
release {
Expand All @@ -33,7 +36,15 @@ android {
}

dependencies {
val lifecycle_version = "2.8.5"
val arch_version = "2.2.0"

// ViewModel
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version")
// Lifecycles only (without ViewModel or LiveData)
implementation("androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9")
implementation("androidx.datastore:datastore-preferences:1.1.1")
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.appcompat)
implementation(libs.material)
Expand Down
37 changes: 36 additions & 1 deletion app/src/main/java/com/alom/androidstudy1/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,20 +1,55 @@
package com.alom.androidstudy1

import android.os.Bundle
import android.view.View
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.lifecycle.viewmodel.viewModelFactory
import com.alom.androidstudy1.databinding.ActivityMainBinding
import kotlinx.coroutines.launch

class MainActivity : AppCompatActivity() {
lateinit var textViewModel: TextViewModel
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
enableEdgeToEdge()
setContentView(R.layout.activity_main)
setContentView(binding.root)
val viewModelFactory =TextViewModelFactory(TextRepository(this))
textViewModel = ViewModelProvider(this, viewModelFactory).get(TextViewModel::class.java)
// val sharedPreferences = getSharedPreferences("alom", MODE_PRIVATE)
// val saveText = sharedPreferences.getString("text","")

lifecycleScope.launch{
lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED){

textViewModel.currentValue.collect{value->
binding.editText.setText(value)
}

}
}

binding.button.setOnClickListener{
handleButtonClick()}

ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
}
private fun handleButtonClick(){
val userInputString = binding.editText.text.toString()
textViewModel.updateValue(userInputString)

}
}
20 changes: 20 additions & 0 deletions app/src/main/java/com/alom/androidstudy1/TextRepository.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.alom.androidstudy1

import android.content.Context
import android.content.Context.MODE_PRIVATE
import android.renderscript.ScriptGroup.Input
import androidx.datastore.core.DataStore
import java.util.prefs.Preferences


class TextRepository(context: Context) {
val sharedPreferences = context.getSharedPreferences("alom", MODE_PRIVATE)
fun saveValue(input: String)
{ val editor = sharedPreferences.edit()
editor.putString("text",input)
editor.apply()}
fun getValue():String{
return sharedPreferences.getString("text","")?:""
}
// private val dataStore: DataStore<Preferences> = context.createDataStore()
}
36 changes: 36 additions & 0 deletions app/src/main/java/com/alom/androidstudy1/TextViewModel.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.alom.androidstudy1

import androidx.appcompat.app.AppCompatActivity.MODE_PRIVATE
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.cancel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch

class TextViewModel(
private val textRepository: TextRepository
): ViewModel() {


// private val _currentUserInput = MutableStateFlow<String>("")
// val currentUserInput: StateFlow<String> = _currentUserInput
private val _currentValue = MutableStateFlow<String>("")
val currentValue: StateFlow<String> = _currentValue
init{
val savedText = textRepository.getValue()
_currentValue.value =savedText.toString()
}

fun updateValue(input: String){
viewModelScope.launch {
textRepository.saveValue(input)
_currentValue.value = input
}
}


}
20 changes: 20 additions & 0 deletions app/src/main/java/com/alom/androidstudy1/TextViewModelFactory.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.alom.androidstudy1

import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlin.coroutines.CoroutineContext

class TextViewModelFactory(
private val repository: TextRepository):ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(TextViewModel::class.java)) {
return TextViewModel(repository) as T
} else {
throw IllegalArgumentException()
}

}
}
26 changes: 24 additions & 2 deletions app/src/main/res/layout/activity_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,34 @@
tools:context=".MainActivity">

<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
android:textSize="30dp"

android:text="메모"
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/editText"
android:layout_width="match_parent"
android:layout_height="500dp"
android:textSize="20dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />

<Button
android:id="@+id/button"
android:text="저장"
android:layout_width="200dp"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/editText" />



</androidx.constraintlayout.widget.ConstraintLayout>