Programing/Android(Kotlin)

[Udemy] 퀴즈 앱(Android 및 Kotlin 개발 완전 정복)

hye3193 2023. 7. 21. 01:26

Tip. 변수/클래스 명 한번에 바꾸기(in AndroidStudio)'

Tip.  Installation did not succeed. The application could not be installed.

다음과 같은 경고가 뜨면 Device Manager > Wipe Data를 통해 초기화 시켜주기...

 

화면을 항상 세로 방향으로 유지하기

AndroidManidest.xml 파일에서 activity 블록에 android:screenOrientation="portrait"을 추가
* portrait: 세로모드, landscape: 가로모드

* portrait을 사용하면 경고가 뜨나, 일단 강의에서는 무시하고 진행하도록 함

 

따로 준비한 배경화면 리소스를 사용하기

준비한 파일을 res > drawable 폴더에 넣고, activity_main.xml 파일에서 android:backgroud="@drawable/<파일명>"으로 설정해준다.

 

상단 상태표시줄 없애기

res > values > themes > themes.xml 파일에서

<item name="android:windowFullscreen">true</item>

위 항목 추가

 

현재 액티비티에서 다른 액티비티로 넘어가기

val intent = Intent(this, QuizQuestionsActivity::class.java)
startActivity(intent)

this로 지정된 액티비티에서 QuizQuestions액티비티로 이동이 가능(자바 파일이기에 뒤에 클래스 자바 추가 필요)

그리고 startActivity로 intent를 실행시켜 준다

* 이 상태에서는 액티비티 뷰가 넘어간 다음, Back 버튼을 누르면 다시 이전 액티비티로 돌아가게 됨

코드에 finish()를 추가하면 Back 버튼 누를 시 이전 액티비티로 넘어가지 않고 앱이 종료

 

Log.i와 Log.d

Log.i : 보통 성공 사례를 보고하는 데 사용(Info 모드에서 확인 가능)

Log.d : 디버깅 목적으로 사용(Debug 모드에서 확인 가능)

 

데이터 클래스 생성하기 (Constants 파일 안에 하드 코딩하는 방식)

1. java > com.example.<appName> 폴더에 kotlin data class를 생성하고, 우선 사용할 데이터 변수들을 생성한다

data class Question(
    val id: Int,
    val question: String,
    val image: Int,
    val optionOne:String,
    val optionTwo:String,
    val optionThree:String,
    val optionFour:String,
    val correctAnswer: Int
)

2. 같은 폴더에 Constants 이름의 Object 파일을 생성 후, 질문을 생성하는 함수 생성

3. 액티비티.kt 파일 내에 메소드 사용해서 데이터 가져오기

val questionsList = Constants.getQuestions()

 

스크롤 뷰 만들기

xml 파일에서 최상단 태그를 ScrollView로 변경, android:fillViewport="true"로 설정하면 화면 전체에 스크롤 뷰가 적용

 

tools 기능에서만 보이는 요소들

TextView 안에 tools:text="<내용>"을 작성하면 앱을 실행시켰을 때는 보이지 않고, tools 기능에서는 보이는 텍스트를 작성할 수 있다

그 외에도 scr으로 이미지를 넣을 수 있는 등, tools: 를 활용해서 다양한 요소를 띄워둘 수 있다.

 

ProgressBar

<ProgressBar
    android:id="@+id/progressBar"
    android:layout_width="0dp"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:max="5"
    android:indeterminate="false" //제한 시간 줄어드는 등, 움직이게 만들 것인지 여부
    android:minHeight="50dp"
    android:progress="0" //현재 진행 상황
    />

 

가중치 설정

가중치를 설정한 요소와 설정하지 않은 요소가 LinearLayout에 의해 정렬된다면, 가중치를 설정하는 요소는 최소한의 사이즈만을 차지하고 나머지 공간을 가중치를 설정한 요소들이 차지한다

 

margin과 padding의 차이

margin: 주변의 요소들로부터 거리를 두기 위해 설정 (바깥쪽에서 거리 두기)

padding: View의 테두리로부터 text 등의 거리를 떨어뜨리기 위해 설정 (안쪽에서 거리 두기)

 

xml을 이용해 배경 만들기

<shape xmlns:android="http://schemas.android.com/apk/res/android" // 모양을 설정
    android:shape="rectangle" //무슨 모양인지 설정
    >
    <stroke //윤곽선 설정
        android:width="1dp"
        android:color="#E8E8E8"/>
    <solid android:color="@color/white"/> //배경색 설정
    <corners android:radius="5dp"/> //코너 둥글기 설정
</shape>

 그리고 메인 view를 표시하는 xml 화면에서 android:background="@id"로 넣으면 적용됨

 

!! (force-unwrapping)

nullable로 선언했던 변수가 이제 null이 될 일이 없을 때, <변수명>!!으로 force-wrapping 처리를 해 준다

 

TextView로 버튼 기능 만들기 (w. AppCompat 액티비티)

1. 클래스에 OnClickListener 인터페이스를 구현

2. onCreate 함수에 각 객체들의 onClickListener를 만들어준다

tvOptionOne?.setOnClickListener(this)
tvOptionTwo?.setOnClickListener(this)
tvOptionThree?.setOnClickListener(this)
tvOptionFour?.setOnClickListener(this)

3. onClick 함수 구현

override fun onClick(view: View?) { //view로 클릭된 객체의 정보를 받아온다
    when(view?.id){ //id 속성을 확인해서 어떤 객체가 클릭된 건지 확인
        R.id.tv_option_one -> {
            tvOptionOne?.let{
                selectedOptionView(it, 1)
            }
        }
        R.id.tv_option_two -> {
            tvOptionTwo?.let{
                selectedOptionView(it, 2)
            }
        }
        R.id.tv_option_three -> {
            tvOptionThree?.let{
                selectedOptionView(it, 3)
            }
        }
        R.id.tv_option_four -> {
            tvOptionFour?.let{
                selectedOptionView(it, 4)
            }
        }
    }
}

let{ } 안에 실행시킬 함수를 입력

 

정보값을 다른 액티비티로 전달

Constants 파일 내에 다음과 같이 변수를 생성해 준다

const val USER_NAME : String = "user_name"
const val TOTAL_QUESTION : String = "total_question"
const val CORRECT_ANSWERS : String = "correct_answers"

전달 코드를 다음과 같이 작성

intent.putExtra(Constants.USER_NAME, etName.text.toString())

전달받을 곳에 코드를 다음과 같이 작성 (사용되는 m<변수명>은 상단에서 추가 해주고 사용해야 됨... 당연히)

mUserName = intent.getStringExtra(Constants.USER_NAME)