상세 컨텐츠

본문 제목

비밀 다이어리 토이 프로젝트

android

by 개복신 개발자 2022. 2. 16. 12:18

본문

728x90
반응형

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은 키 값으로 볼 수 있다.

반응형

'android' 카테고리의 다른 글

로또 번호 추첨 토이 프로젝트  (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

관련글 더보기

댓글 영역