passwordLayout 코드
app:layout_constraintVertical_bias="0.45"
-수직으로 위치 조정
값이 1에 가까울 수록 밑으로 이동하고 0에 가까울 수록 위로 이동
어플 제목 Textview
android:fontFamily="@font/bm_font"
-폰트 적용하기
bm_font 파일을 다운 받아서 font 파일에 넣음(font 파일 따로 생성)
button들
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/openButton"
android:layout_width="40dp"
android:layout_height="60dp"
android:layout_marginEnd="10dp"
android:background="#A3A3A3"
app:layout_constraintBottom_toBottomOf="@id/numberPicker1"
app:layout_constraintEnd_toStartOf="@id/numberPicker1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/numberPicker1" />
-안드로이드 상의 기본 테마가 적용되어서
버튼의 색상을 따로 지정하여도 색상 변화가 일어나지 않았다
따라서 AppCompatButton으로 바꾸어서 문제를 해결했다.
app:layout_constraintHorizontal_chainStyle="packed"
-
● CHAIN_SPREAD 뷰들을 골고루 펼쳐 여백을 같게 합니다(기본값)
● CHAIN_SPREAD_INSIDE CHAIN_SPREAD와 비슷하지만 가장 외곽에 있는 뷰들은 부모 뷰와 여백이 없는 상태로 골고루 펼쳐집니다.
● CHAIN_PACKED뷰들이 똘똘 뭉치게 되고 부모뷰로부터의 여백을 같게 합니다. 여백을 조정하고 싶다면 bias조정을 통해 한쪽으로 치우치게 만들 수 있습니다
themes.xml
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.Aoppart02chapter03" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/white</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_700</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
<style name="Theme.Aoppart02chapter03.NoActionBar" parent="Theme.MaterialComponents.DayNight.NoActionBar"/>
</resources>
<style name="Theme.Aoppart02chapter03.NoActionBar" parent="Theme.MaterialComponents.DayNight.NoActionBar"/>
-NoActionBar 스타일을 추가하였음
이를 manifest.xml에 mainActivity 테마에 추가하여
위의 액션바를 제거함
MainActivity 코드 작성
private val numberPicker1: NumberPicker by lazy {
findViewById<NumberPicker>(R.id.numberPicker1)
.apply {
minValue = 0
maxValue = 9
}
}
-mainactivity에서 numberpicker 선언
private val -> 변하지 않는 값이기 때문에
-findViewById<타입 지정!!>
- .apply {}
numberPicker.minValue = 0 을 그냥 minValue = 0로 쓸 수 있다
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
numberPicker1
numberPicker2
numberPicker3
-이를 메인 함수에서 호출해야 함
lazy로 선언했기 때문에 oncreate 함수가 실행될 때 같이 ui에 나와야 하기 때문이다
openButton.setOnClickListener {
if (changePasswordMode) {
Toast.makeText(this, "비밀번호 변경 중입니다. ", Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
val passwordPreferences = getSharedPreferences("password", Context.MODE_PRIVATE)
val passwordFromUser = "${numberPicker1.value}${numberPicker2.value}${numberPicker3.value}"
if (passwordPreferences.getString("password", "000").equals(passwordFromUser)) {
// 패스워드 성공
//TODO 다이어리 페이지 작성 후에 넘겨주어야 함
//startActivity()
}
else {
//패스워드 실패
showErrorAlertDialog()
}
}
-getSharedPreference는 키-값 데이터를 저장하기 위해 사용한다.
-passwordPreferences.getString(가져올 값 이름, 초기값)
changePasswordButton.setOnClickListener {
val passwordPreferences = getSharedPreferences("password", Context.MODE_PRIVATE)
val passwordFromUser = "${numberPicker1.value}${numberPicker2.value}${numberPicker3.value}"
if (changePasswordMode) {
passwordPreferences.edit (commit = true){
putString("password", passwordFromUser)
}
changePasswordMode =false
changePasswordButton.setBackgroundColor(Color.BLACK)
}
else {
// ChangePasswordMode가 활성화 :: 비밀번호가 맞는지를 체크
if (passwordPreferences.getString("password", "000").equals(passwordFromUser)) {
changePasswordMode = true
Toast.makeText(this, "변경할 패스워드를 입력해주세요", Toast.LENGTH_SHORT).show()
changePasswordButton.setBackgroundColor(Color.RED)
}
else {
//패스워드 실패
showErrorAlertDialog()
}
}
}
passwordPreferences.edit (commit = true){
putString("password", passwordFromUser)
}
-passwordPreference.edit을 통해 수정
commit = ture로 저장한다
putString 함수로 저장!
private fun showErrorAlertDialog() {
AlertDialog.Builder(this)
.setTitle("실패!!")
.setMessage("비밀번호가 잘못되었습니다. ")
.setPositiveButton("확인") { _, _ -> }
.create()
.show()
}
-위의 알림창을 띄우는 코드
activity_diary.xml
<?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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#3F51B5"
android:padding="24dp">
<EditText
android:id="@+id/diaryEditText"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@color/white"
android:gravity="start|top"
android:padding="10dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
- uI 구성 만들기
diaryActivity.kt
class DiaryActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_diary)
}
}
-AppCompatActivity 타입
-setContentView로 보여질 화면 연결하기
val diaryEditText = findViewById<EditText>(R.id.diaryEditText)
val detailPreferences = getSharedPreferences("diary", Context.MODE_PRIVATE)
diaryEditText.setText(detailPreferences.getString("detail", ""))
-diaryEditText를 지정
-detailPreferences = getSharedPreferences.getString("diary", context.MODE_PRIVATE)
==>diary 키 값으로 저장할 수 있도록
-diaryEditText.setText(detailPreferences.getString("detail", ""))
detailPreferences에 diary로 저장된 값으로 set하도록 설정
private val handler = Handler(Looper.getMainLooper())
val runnable = Runnable {
getSharedPreferences("diary", Context.MODE_PRIVATE).edit{
putString("detail", diaryEditText.text.toString())
}
Log.d("DiaryActivity", "SAVE!!! ${diaryEditText.text.toString()}")
}
diaryEditText.addTextChangedListener {
Log.d("DiaryActivity", "TextChanged :: $it")
handler.removeCallbacks(runnable) //이전에 있던 runnable을 지운다
handler.postDelayed(runnable, 500)
}
-Thread
스레드(thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다.
-handler
조종대라 생각하면됨
-addTextChangeListener에서 변화를 감지한다
handler.removeCallbacks(runnable)을 통해서 이전의 runnable을 지운다
hanler.postDelayed(runnable, 500)
500ms가 지나도 아무 움직임이 없다면 runnable을 실행한다.
-runnable
getSharedPreferences.edit으로 저장된 내용을 수정한다.
diaryEditText의 값으로 수정된다.
putString("detail", diaryEditText.text.toString())로 저장
이를 나중에 가져올 때도 detailPreferences.getString("detail", "초기값[저장된 값이 없을 때]")
를 이용해 값을 가져온다
detail은 키 값으로 볼 수 있다.
로또 번호 추첨 토이 프로젝트 (0) | 2022.02.09 |
---|---|
BMI 계산기 안드로이드 앱 토이프로젝트 (0) | 2022.02.08 |
kotlin 2강 (0) | 2022.02.07 |
kotlin 1강 정리 (0) | 2022.02.04 |
단말기 테스트 (0) | 2021.09.06 |
댓글 영역