• 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    해결됨

SentenceList를 intent.putExtra로 옮길 수 없을까요?

23.08.16 17:30 작성 조회수 247

0

안녕하세요 좋은 강의로 도움 많이받고있는 학생입니다.

똑같은 리스트를 또 선언해야하는 점을 보완하고 싶어서 시도해보고있습니다.

intent.putStringArrayListExtra("list",ArrayList(sentenceList))

val sentenceList = intent.getStringArrayExtra("list")!!.toMutableList()로 시도해보니 intent.get에서 null값만 옵니다.

List를 두 액티비티가 공유해서 사용할 방법이 뭐가 있을까요?

  1. 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())
    }
}

 

  1. 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데이터 공유 와 같은 키워드로 한번 찾아보시겠어요?

망곰님의 프로필

망곰

질문자

2023.08.18

그렇군요! 갑자기 꽂혀서 불필요한 부분에 매달린것같네요 ㅜㅜ
앞으로 더 공부해서 말씀해주신 강의와 검색키워드 참고하겠습니다 감사합니다!

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.08.18

안녕하세요, 인프런 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 부분을 참고하시면 도움이 될 것 같아요. 많이들 질문하셨는데 도움이 되셨기를 바랄게요!

망곰님의 프로필

망곰

질문자

2023.08.18

알려주신 코드를 토대로 해결하였습니다. 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()


    }
}