인프런 커뮤니티 질문&답변
onBackPressed 함수가 동영상 하고 다르게 동작합니다.
작성
·
47
0
선생님 안녕하세요.
아래 함수만 추가 하고 back버튼을 클릭 한번만 해도 오류 없이 자동으로 앱이 종료 됩니다.
로그도 다르게 나옵니다.
전체 소스 공유 드립니다.
https://drive.google.com/file/d/1pywWeGHuAAZb0a0nC1IZZdje1wLZxlLv/view?usp=sharing
override fun onBackPressed()

답변 2
0
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() 호출이 원인일 때 문제를 해결하는 방법을 설명하고 있습니다. 코드를 기반으로 버튼이 두 번 눌러졌을 때만 종료되는 동작을 구현할 수 있도록 도움을 드리고 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.







안녕하세요.
구글 드라이브에 올라간 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)
}
}