Programing/Android(Kotlin)

[Android/Kotlin] 액티비티 이동, 데이터 전달

hye3193 2023. 8. 29. 00:02

게시글 작성 화면으로 넘어가기(View 클릭)

게시글 작성 액티비티(BoardWriteActivity.kt)를 새롭게 하나 만들어준다

class BoardFragment : Fragment(), View.OnClickListener

우선 클래스에 onClickListener를 추가한 뒤,

 

binding.btnWrite.setOnClickListener(this)

onViewCreated에서 onClickListener를 만들어준다

 

override fun onClick(v: View) {
    when (v.id) {
        R.id.btn_write -> {
            val intent = Intent(requireContext(), BoardWriteActivity::class.java)
            startActivity(intent)
        }
    }
}

그리고 onClick 함수를 만든다

* Intent 사용 시, Fragment 에서는 context 자리에 this 대신 requireContext() / getContext()를 사용해줘야 context 인수로 인식한다 (그냥 context로만 작성해도 getContext()로 인식)

https://stackoverflow.com/questions/65815020/kotlin-intent-none-of-the-following-functions-can-be-called-with-the-arguments

 

게시글 조회 화면으로 넘어가기(리사이클러뷰 클릭) & 데이터 전달

private val context = itemView.context

뷰홀더 클래스 안에 context 변수를 추가해 준다

 

fun bind(item: BoardItem) {
    itemView.setOnClickListener {
        val intent = Intent(context, BoardDetailActivity::class.java)
        intent.putExtra("data", item)
        intent.run { context.startActivity(this) }
    }
}

bind 함수를 만들어 클릭시 putExtra로 데이터를 전달하고, 액티비티를 이동시킨다

 

override fun onBindViewHolder(holder: BoardViewHolder, position: Int) {
    val boardItem = itemList[position]
    holder.bind(boardItem)
}

onBindViewHolder 함수에서 bind 함수를 불러준다

 

class BoardDetailActivity: AppCompatActivity() {

    private lateinit var binding: BoardDetailActivityBinding
    private lateinit var data: BoardItem
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = BoardDetailActivityBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val data = if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            intent.getParcelableExtra("data", BoardItem::class.java)
        } else {
            intent.getParcelableExtra("data") as? BoardItem
        }

        binding.postingBadge.text = data?.badge
        binding.postingTitle.text = data?.title
        binding.postingContent.text = data?.content
    }
}

세부 화면 액티비티에서 위와 같이 코드를 작성해 준다

 

val data = if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    intent.getParcelableExtra("data", BoardItem::class.java)
} else {
    intent.getParcelableExtra("data") as? BoardItem
}

데이터를 받아오는 부분에서 위와 같이 안드로이드 버전 별 분기를 나누어 작성해주어야 한다

(참고. https://velog.io/@jeep_chief_14/getParcelableExtra-getSerializable-is-deprecated-in-Android-13)

 

+

에러 메시지

android.content.ActivityNotFoundException: Unable to find explicit activity class

한 화면에서 다른 화면으로 넘어갈 때 발생하는 문제인데,

새로운 acitivty를 생성하면 Manifest 파일에 추가해줘야 하는데 그러지 않아서 발생했다

<activity
    android:name=".BoardDetailActivity"/>

application 태그 안에 해당 액티비티를 입력해 주면 된다