본문 바로가기
안드로이드/Activity

인텐트 (명시적, 암시적) # ActivityResultContracts

by 김어찐 2022. 10. 3.
728x90

FirstFragment

package com.ej.datatransfer.fragment

import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.os.bundleOf
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.*
import androidx.navigation.fragment.findNavController
import com.ej.datatransfer.R
import com.ej.datatransfer.ResultActivity
import com.ej.datatransfer.databinding.ActivityMainBinding
import com.ej.datatransfer.databinding.FragmentFirstBinding
import com.ej.datatransfer.viewmodel.MainViewModel


class FirstFragment : Fragment() {

    lateinit var firstFragmentBinding: FragmentFirstBinding
    val mainViewModel by activityViewModels<MainViewModel>()

    // 암시적 인텐트
    lateinit var getContent: ActivityResultLauncher<String>
    // 명시적 인텐트
    lateinit var startActivityForResult : ActivityResultLauncher<Intent>


    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        firstFragmentBinding = DataBindingUtil.inflate(inflater,R.layout.fragment_first,container,false)

        // 갤러리에서 사진 갖고오기
        getContent =  registerForActivityResult(
            ActivityResultContracts.GetContent()){
            firstFragmentBinding.imageView.setImageURI(it)
        }


        // 다른 액티비티에서 결과 갖고오기
        startActivityForResult = registerForActivityResult(
            ActivityResultContracts.StartActivityForResult()
        ) {activityResult ->
            activityResult.data?.let {  intent ->
                intent.extras?.let { bundle ->
                    Log.d("FirstFragment","result : ${bundle.getString("data","world")}")
                }
            }
        }
        return firstFragmentBinding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        // 다른 액티비티로 이동
        firstFragmentBinding.secondBtn.setOnClickListener {
            Intent(requireContext(),ResultActivity::class.java).apply {
                startActivityForResult.launch(this)
            }
        }

        // 갤러리로 이동
        firstFragmentBinding.thirdBtn.setOnClickListener {
            // MIME TYPE
            getContent.launch("image/*")
        }

//        firstFragmentBinding.thirdBtn.setOnClickListener {
//            findNavController().navigate(R.id.action_firstFragment_to_thirdFragment)
//        }
    }
}

 

ResultActivity

package com.ej.datatransfer

import android.app.Activity
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.databinding.DataBindingUtil
import com.ej.datatransfer.databinding.ActivityMainBinding
import com.ej.datatransfer.databinding.ActivityResultBinding

class ResultActivity : AppCompatActivity() {
    lateinit var resultActivityBinding : ActivityResultBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        resultActivityBinding = DataBindingUtil.setContentView(this, R.layout.activity_result)

        resultActivityBinding.resultBtn.setOnClickListener {
            val intent = Intent()
            intent.putExtra("data","hello")
            setResult(Activity.RESULT_OK,intent)
        }
    }
}
728x90