해결된 질문
작성
·
375
0
안녕하세요 좋은 강의로 도움 많이받고있는 학생입니다.
똑같은 리스트를 또 선언해야하는 점을 보완하고 싶어서 시도해보고있습니다.
intent.putStringArrayListExtra("list",ArrayList(sentenceList))
와
val sentenceList = intent.getStringArrayExtra("list")!!.toMutableList()
로 시도해보니 intent.get에서 null값만 옵니다.
List를 두 액티비티가 공유해서 사용할 방법이 뭐가 있을까요?
MainActivity.kt
package com.yndoo.goodwords
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.databinding.DataBindingUtil
import com.yndoo.goodwords.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("지식은 사랑이자, 빛이자, 통찰력이다.")
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
binding.showAllSentenceBtn.setOnClickListener {
val intent = Intent(this, SentenceActivity::class.java)
//intent.putExtra("ㅇㅇ",ArrayList(sentenceList))
intent.putStringArrayListExtra("list",ArrayList(sentenceList))
startActivity(intent)
}
binding.goodwordTextView.setText(sentenceList.random())
}
}
SentenceActivity.kt
package com.yndoo.goodwords
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.ListView
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("지식은 사랑이자, 빛이자, 통찰력이다.")
*/
//val sentenceList = intent.getStringArrayExtra("ㅇㅇ")?.toMutableList()
val sentenceList = intent.getStringArrayExtra("list")!!.toMutableList()
Log.d("여기",sentenceList.toString()) //로그에 null찍힘
val myadapter = ListViewAdapter(sentenceList!!)
val listview = findViewById<ListView>(R.id.sentenceListView)
listview.adapter = myadapter
}
}
답변 2
0
안녕하세요
2개의 액티비티에서 저렇게 전체 리스트를 전달하는것은 일반적이지는 않습니다.
보통 액티비티에서 한번 데이터를 받아오고 Fragment 간에 데이터를 전달할 수 있는데
일반적으로 ViewModel을 사용해서 구현하고 있습니다.
이 강의에서도 다루고 있긴 하지만
https://www.inflearn.com/course/%EC%B9%9C%EC%A0%88%ED%95%9C-jetpack-1#reviews
간단한 데이터 전달 정도를 학습하시고 싶으시면 수강하실 필요는 없습니다.
ViewModel Fragment Activity데이터 공유 와 같은 키워드로 한번 찾아보시겠어요?
0
안녕하세요, 인프런 AI 인턴이에요.
두 개의 액티비티가 리스트를 공유해서 사용하기 위해서는 Intent를 사용하는 방법이 하나 있습니다. 하지만, 현재 코드에서는 데이터를 전달하는 것은 잘 되는 것 같은데, 데이터를 받을 때 null 값만 받는 문제가 발생하고 있는 것 같아요.
이런 경우에는 다음과 같이 해결할 수 있을 것 같아요. MainActivity에 리스트 값을 추가하려면 startActivityForResult 함수를 사용해서 결과 값을 받아올 수 있도록 합니다. 그리고 SecondActivity에서는 setResult 함수를 사용해서 값을 전달하고 finish 함수를 사용해서 액티비티를 종료합니다. 이렇게 하면 MainActivity로 다시 돌아갈 때, onActivityResult 함수를 사용해서 결과 값을 받을 수 있게 됩니다.
예를 들어, MainActivity에서 SecondActivity로 이동하는 코드가 다음과 같다고 가정해봅시다.
val intent = Intent(this, SecondActivity::class.java)
startActivityForResult(intent, 1)
그리고 SecondActivity에서 값을 전달한다면, 다음과 같이 setResult 함수를 사용합니다.
val sentenceList = mutableListOf<String>()
sentenceList.add("시간이 흐른다고 미래가 되지는 않는다.")
sentenceList.add("먼 과거에 몰두하지 말고 가까운 현재를 파악하라.")
sentenceList.add("인생에서 가장 진귀한 것은 시간이다.")
val intent = Intent()
intent.putStringArrayListExtra("list", ArrayList(sentenceList))
setResult(Activity.RESULT_OK, intent)
finish()
그리고 MainActivity에서 결과 값을 받을 때, 다음과 같이 onActivityResult 함수를 사용합니다.
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == 1) {
if (resultCode == Activity.RESULT_OK) {
val sentenceList = data?.getStringArrayListExtra("list")
// 사용할 코드 작성
}
}
}
이렇게 하면 MainActivity에서 Intent를 통해 SecondActivity로 데이터를 전달하고, 다시 결과 값을 받아올 수 있을 것 같아요. 참고로, requestCode는 여러 개의 액티비티를 사용할 경우에 구분하기 위해 사용되는 값이에요. 이를 통해 어떤 액티비티로부터 결과 값을 받았는지 확인할 수 있습니다.
더 자세한 내용은 Android 개발 공식 문서의 startActivityForResult 부분을 참고하시면 도움이 될 것 같아요. 많이들 질문하셨는데 도움이 되셨기를 바랄게요!
알려주신 코드를 토대로 해결하였습니다. SentenceActivity로부터 ("No?", "No")의 데이터를 받았을 때만 setResult를 하도록 조금 변경했더니 제가 원하던대로 되었습니다. 정말 감사합니다!
아래로 두 액티비티 코드입니다.
SentenceActivity
package com.yndoo.goodwords
import android.app.Activity
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.ListView
class SentenceActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_sentence)
// 데이터 요청?
val intent2 = Intent(this, MainActivity::class.java)
intent2.putExtra("No?","No")
startActivityForResult(intent2, 222)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if(resultCode != RESULT_OK){
return
}
if(requestCode == 222){
//MainActivity에서 intent3으로 보내준 list 받아옴
val res = data!!.getStringArrayListExtra("list")
Log.d("*****", res.toString())
val myadapter = ListViewAdapter(res!!.toMutableList())
val lv = findViewById<ListView>(R.id.sentenceListView)
lv.adapter = myadapter
}
}
}
MainActivity
package com.yndoo.goodwords
import android.app.Activity
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import androidx.databinding.DataBindingUtil
import com.yndoo.goodwords.databinding.ActivityMainBinding
import kotlin.math.log
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("지식은 사랑이자, 빛이자, 통찰력이다.")
if (intent.getStringExtra("No?")=="No"){
//No메시지가 오면 데이터요청임!
//list를 보내줌
val intent3 = Intent()
intent3.putStringArrayListExtra("list",ArrayList(sentenceList))
setResult(Activity.RESULT_OK, intent3)
finish()
}
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
binding.showAllSentenceBtn.setOnClickListener {
// 전체 리스트 보기 버튼 눌리면 SentenceActivity로감
val intent = Intent(this, SentenceActivity::class.java)
startActivity(intent)
}
binding.goodwordTextView.text = sentenceList.random()
}
}
그렇군요! 갑자기 꽂혀서 불필요한 부분에 매달린것같네요 ㅜㅜ
앞으로 더 공부해서 말씀해주신 강의와 검색키워드 참고하겠습니다 감사합니다!