강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

후다닥님의 프로필 이미지
후다닥

작성한 질문수

[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)

안드로이드 앱 뒤로가기 버튼 이벤트

onBackPressed 함수가 동영상 하고 다르게 동작합니다.

작성

·

47

0

선생님 안녕하세요.

아래 함수만 추가 하고 back버튼을 클릭 한번만 해도 오류 없이 자동으로 앱이 종료 됩니다.

로그도 다르게 나옵니다.

전체 소스 공유 드립니다.

 

https://drive.google.com/file/d/1pywWeGHuAAZb0a0nC1IZZdje1wLZxlLv/view?usp=sharing

 

override fun onBackPressed() 
image.png

답변 2

0

개복치개발자님의 프로필 이미지
개복치개발자
지식공유자

안녕하세요

첨부주신 코드에

onBackPressed

가 없는데 잘 못 올려주신게 아닐까 싶습니다.

후다닥님의 프로필 이미지
후다닥
질문자

안녕하세요.

 

구글 드라이브에 올라간 backButtonex (2).zip 파일에 아래 소스가 있습니다.

 

감사합니다.

 

package com.chpang.backbuttonex

import android.os.Bundle

import android.os.Handler

import android.util.Log

import android.widget.Toast

import androidx.activity.enableEdgeToEdge

import androidx.appcompat.app.AppCompatActivity

import androidx.core.view.ViewCompat

import androidx.core.view.WindowInsetsCompat

class MainActivity : AppCompatActivity() {

private var isDouble =false

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main)

}

override fun onBackPressed(){

Log.d("MainActivity", "backbutton클릭")

if(isDouble == true) {

finish()

}

isDouble = true

Toast.makeText(this, "종료하실려면 더블 클릭", Toast.LENGTH_LONG).show()

Handler().postDelayed( {

isDouble =false

}, 2000)

}

}

개복치개발자님의 프로필 이미지
개복치개발자
지식공유자

스크린샷 2026-01-07 오후 9.11.21.png

첨부주신 링크에는 listview.exp.zip 만 있는 것 같습니다 혹시 이게 맞으실까요?

후다닥님의 프로필 이미지
후다닥
질문자

https://drive.google.com/file/d/1FrzEyNCQLUPt0vY9Vd8kGi4KRnFyIRy4/view?usp=sharing

 

파일은 있는데, 공유 기능이 원할하지 않은것 같습니다.

공유 링크 보내드립니다.

후다닥님의 프로필 이미지
후다닥
질문자

전체 소스를 올려 드립니다.

명언 리스트를 클릭시 반응이 없습니다.

package com.chpang.chpanggoodword

import android.view.LayoutInflater

import android.view.View

import android.view.ViewGroup

import android.widget.BaseAdapter

import android.widget.TextView

class ListViewAdapter(val List : MutableList<String>): BaseAdapter() {

override fun getCount(): Int {

return List.size

}

override fun getItem(position: Int): Any? {

return List[position]

}

override fun getItemId(position: Int): Long {

return position.toLong()

}

override fun getView(

position: Int,

convertView: View?,

parent: ViewGroup?

): View? {

var convertView = convertView

if (convertView == null) {

convertView =

LayoutInflater.from(parent?.context).inflate(R.layout.listview_item, parent, false)

}

val listviewText = convertView?.findViewById<TextView>(R.id.listViewTextArea)

listviewText!!.text = List[position]

return convertView!!

}

}

package com.chpang.chpanggoodword

import android.content.Intent

import android.os.Bundle

import android.util.Log

import androidx.appcompat.app.AppCompatActivity

import androidx.databinding.DataBindingUtil

import com.chpang.chpanggoodword.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

private lateinit var binding : ActivityMainBinding

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main)

val sentenceList = mutableListOf<String>()

sentenceList.add("검정화면에 대충 흰글씨 쓰면 명언같다.")

sentenceList.add("사람에게 하나의 입과 두 개의 귀가 있는 것은 말하기보다 듣기를 두 배로 하라는 뜻이다.")

sentenceList.add("결점이 없는 친구를 사귀려고 한다면 평생 친구를 가질 수 없을 것이다.")

sentenceList.add("자기 아이에게 육체적 노동을 가르치지 않는 것은 약탈과 강도를 가르치는 것과 마찬가지다.")

sentenceList.add("승자는 눈을 밟아 길을 만들지만 패자는 눈이 녹기를 기다린다.")

sentenceList.add("두 개의 화살을 갖지 마라. 두 번째 화살이 있기 때문에 첫 번째 화살에 집중하지 않게 된다.")

sentenceList.add("그 사람 입장에 서기 전까지 절대 그 사람을 욕하거나 책망하지 마라.")

sentenceList.add("뛰어난 말에게도 채찍이 필요하다.")

Log.e("MainActivity", sentenceList.random())

binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

binding.showAllSentenceBtn.setOnClickListener {

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

startActivity(intent)

}

binding.goodWordTextArea.setText(sentenceList.random())

}

}

package com.chpang.chpanggoodword

import android.os.Bundle

import android.widget.ListView

import androidx.appcompat.app.AppCompatActivity

class SentenceActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_sentence)

val sentenceList = mutableListOf<String>()

sentenceList.add("검정화면에 대충 흰글씨 쓰면 명언같다.")

sentenceList.add("사람에게 하나의 입과 두 개의 귀가 있는 것은 말하기보다 듣기를 두 배로 하라는 뜻이다.")

sentenceList.add("결점이 없는 친구를 사귀려고 한다면 평생 친구를 가질 수 없을 것이다.")

sentenceList.add("자기 아이에게 육체적 노동을 가르치지 않는 것은 약탈과 강도를 가르치는 것과 마찬가지다.")

sentenceList.add("승자는 눈을 밟아 길을 만들지만 패자는 눈이 녹기를 기다린다.")

sentenceList.add("두 개의 화살을 갖지 마라. 두 번째 화살이 있기 때문에 첫 번째 화살에 집중하지 않게 된다.")

sentenceList.add("그 사람 입장에 서기 전까지 절대 그 사람을 욕하거나 책망하지 마라.")

sentenceList.add("뛰어난 말에게도 채찍이 필요하다.")

val sentenceAdapter = ListViewAdapter(sentenceList)

val listview = findViewById<ListView>(R.id.sentenceListView)

listview.adapter = sentenceAdapter

}

}

<?xml version="1.0" encoding="utf-8"?>

<layout>

<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"

android:background="@color/black"

tools:context=".MainActivity">

<Button

android:id="@+id/showAllSentenceBtn"

android:layout_width="150dp"

android:layout_height="50dp"

android:layout_margin="20dp"

android:text="전체명언보기"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintTop_toTopOf="parent" />

<TextView

android:id="@+id/goodWordTextArea"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="명언이 들어갈 위치 입니다1"

android:fontFamily="@font/bmkkubulim"

android:gravity="center"

android:layout_margin="20dp"

android:textColor="@color/white"

android:textSize="30sp"

app:layout_constraintBottom_toBottomOf="parent"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintStart_toStartOf="parent"

app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

</layout>

<?xml version="1.0" encoding="utf-8"?>

<androidx.constraintlayout.widget.ConstraintLayout

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".SentenceActivity">

<ListView

android:id="@+id/sentenceListView"

android:layout_width="match_parent"

android:layout_height="match_parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="60dp">

<TextView

android:id="@+id/listViewTextArea"

android:textSize="15sp"

android:layout_margin="10dp"

android:text="TextArea"

android:layout_width="wrap_content"

android:layout_height="wrap_content"/>

</LinearLayout>

개복치개발자님의 프로필 이미지
개복치개발자
지식공유자

뒤로가기 부분은 이렇게 수정해보시겠어요?

package com.chpang.backbuttonex

import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.util.Log
import android.widget.Toast
import androidx.activity.OnBackPressedCallback
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {

    private var isDouble =false

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                Log.d("MainActivity", "backbutton클릭")
                if (isDouble) {
                    finish()
                    return
                }

                isDouble = true
                Toast.makeText(this@MainActivity, "종료하실려면 더블 클릭", Toast.LENGTH_LONG).show()
                Handler(Looper.getMainLooper()).postDelayed({
                    isDouble = false
                }, 2000)
            }
        })
    }
}



---

그리고 새로 올려주신 부분은 구글 드라이브를 통해서 공유해주시면 살펴보겠습니다.

빠르게 새 강의를 제작하겠습니다 🙇

후다닥님의 프로필 이미지
후다닥
질문자

안녕하세요.
명언 소스 수정한걸 다른 질문에 올려야 하는데 제가 혼동 한것 같습니다.

요청하신 명언 소스 압축해서 구글 드라이브에 올렸습니다.
링크 보내드립니다.


https://drive.google.com/file/d/1AECEvhdqfubGCfwQCJliGefJGsQ_ysZi/view?usp=sharing

개복치개발자님의 프로필 이미지
개복치개발자
지식공유자

클릭하면 toast메세지가 나오지 않는다는 말씀이시죠?

 

package com.chpang.chpanggoodword

import android.os.Bundle
import android.widget.ListView
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.databinding.DataBindingUtil
import com.chpang.chpanggoodword.databinding.ActivityMainBinding
import kotlin.math.log

class SentenceActivity : AppCompatActivity() {


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sentence)

        val sentenceList = mutableListOf<String>()

        sentenceList.add("검정화면에 대충 흰글씨 쓰면 명언같다.")
        sentenceList.add("사람에게 하나의 입과 두 개의 귀가 있는 것은 말하기보다 듣기를 두 배로 하라는 뜻이다.")
        sentenceList.add("결점이 없는 친구를 사귀려고 한다면 평생 친구를 가질 수 없을 것이다.")
        sentenceList.add("자기 아이에게 육체적 노동을 가르치지 않는 것은 약탈과 강도를 가르치는 것과 마찬가지다.")
        sentenceList.add("승자는 눈을 밟아 길을 만들지만 패자는 눈이 녹기를 기다린다.")
        sentenceList.add("두 개의 화살을 갖지 마라. 두 번째 화살이 있기 때문에 첫 번째 화살에 집중하지 않게 된다.")
        sentenceList.add("그 사람 입장에 서기 전까지 절대 그 사람을 욕하거나 책망하지 마라.")
        sentenceList.add("뛰어난 말에게도 채찍이 필요하다.")

        val sentenceAdapter = ListViewAdapter(sentenceList)
        val listview = findViewById<ListView>(R.id.sentenceListView)

        listview.adapter = sentenceAdapter

        listview.setOnItemClickListener { _, _, position, _ ->
            Toast.makeText(this, sentenceList[position], Toast.LENGTH_SHORT).show()
        }
    }
}

이렇게 해보시겠어요?

후다닥님의 프로필 이미지
후다닥
질문자

감사합니다.

잘 됩니다.^^

0

안녕하세요, 인프런 AI 인턴입니다. 후다닥님.

onBackPressed 메소드가 예상과 다르게 동작하는 이유는 super.onBackPressed() 호출 때문일 수 있습니다. super.onBackPressed()는 기본적으로 현재 액티비티를 종료하는 역할을 합니다. 따라서, 해당 메소드를 호출하면 뒤로 가기 버튼을 한 번만 눌러도 앱이 종료될 수 있습니다.

여러분이 원하는 행동이 특정 조건이 만족되었을 때만 앱이 종료되는 것이라면, 이 메소드 호출을 적절히 조정해야 합니다. super.onBackPressed()를 주석 처리하거나 필요에 따라 조건적으로 실행하는 방식으로 수정해 볼 수 있습니다.

아래 유사한 질문과 진행 방식이 제안된 링크를 참고해 주세요:

이 게시물이 super.onBackPressed() 호출이 원인일 때 문제를 해결하는 방법을 설명하고 있습니다. 코드를 기반으로 버튼이 두 번 눌러졌을 때만 종료되는 동작을 구현할 수 있도록 도움을 드리고 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

후다닥님의 프로필 이미지
후다닥

작성한 질문수

질문하기