프로그래밍/Kotlin

[코틀린/안드로이드] Intent를 활용하여 Activity 전환하기

pupu91 2022. 10. 24. 17:44
반응형
activity_main.xml

 

activity_sub.xml

 

viewBinding 설정

 

 

예시1) 버튼 클릭시 메인 액티비티에서 서브 액티비티로 전환

MainActivity
class MainActivity: AppCompatActivity() {
	
    val binding by lazy { ActivityMainBinding.inflate(layoutInflater)}
	
      override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)
      
      /*사용할 액티비티 타입정보를 명시적으로 작성하여 Intent 생성
        this : 자기자신(여기서는 MainActivity), 전환 할 class*/
      val intent = Intent(this, SubActivity::class.java) 
      
      /*startActivity에 intent를 전달하면 작성 된 intent를 해석하여 실행할 액티비티를 결정한다.
      	이 때, 사용할 액티비티 정보와 데이터가 담긴 인텐트를 함께 전달해야 한다.*/
      binding.btnStart.setOnClickListener{
      		startActivity(intent)
      }     
}

 

 


예시 2) 버튼  클릭 시 메인 액티비티에서 서브 액티비티로 데이터 전달하며 전환

MainActivity
class MainActivity: AppCompatActivity() {
	
    val binding by lazy { ActivityMainBinding.inflate(layoutInflater)}
	
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)
    
        /*Intent 생성*/
        val intent = Intent(this, SubActivity::class.java)
        
        /* 인텐트 내부에는 번들(Bundle)이라는 데이터 저장 공간이 있어서 
        번들에 데이터를 담아 전달할 수 있다. 인텐트 내부 번들에 값을 담을 때는
        putExtra 메소드를 이용하여 Key, value 방식으로 값을 담는다(Map과 유사)*/
        intent.putExtra("from1", "Hello Greedy")
        intent.putExtra("from2", 2022)
        
        binding.btnStart.setOnClickListener{
        	startActivity(intent)
        } 
    
    
    }
}

 

 

 

SubActivity에 하고자 하는 동작 작성
class SubActivity : AppCompatActivity() {

    val binding by lazy { ActivitySubBinding.inflate(layoutInflater) }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)
   
     /* 메인에서 인텐트로 담아준 값 가져와서 to1,to2에 담기
        intent는 액티비티의 기본 프로퍼티이기 때문에 전달 된 intent를 바로 호출해서 사용 가능*/
     binding.to1.text = intent.getStringExtra("from1")
     
     /* 문자열의 경우 값이 없으면 blank로 처리 되지만, 숫자의 경우 defaultValue를 지정해주어야 한다.*/
     binding.to2.text = "${intent.getIntExtra("from2", 0)}" 
        
    }
 }

 

예시2) 실행 결과

 

 

반응형

예시3)  버튼 클릭 시 메인 액티비티에서 서브 액티비티로 데이터 전달하며 전환되고, 서브 액티비티에서 메세지 입력 후  다시 메인 액티비티로 전환

MainActivity
class MainActivity: AppCompatActivity() {
	
    val binding by lazy { ActivityMainBinding.inflate(layoutInflater)}
	
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)
    
        
        val intent = Intent(this, SubActivity::class.java)
        
        intent.putExtra("from1", "Hello Greedy")
        intent.putExtra("from2", 2022)
		
        /* result가 존재하는 activity 동작시 사용할 resultListener 정의 */
		val resultListener = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
    	
        /*result의 resultCode RESULT_OK라면*/
        if(it.resultCode == Activity.RESULT_OK){
        	
        /* it.data 자체가 리턴 받은 intent 객체이다(it은 result)
        retrunValue라는 key 값으로 intent에 전달 된 값을 message로 꺼내고*/
            val message = it.data?.getStringExtra("retrunValue")
            /* MainActivity 위에 짧은 길이로 전달받은 message를 Toast 위젯으로 보여준다.*/
            Toast.makeText(this@MainActivity, message, Toast.LENGTH_SHORT).show()
        	//-> context 위에 어떤 텍스를 기반으로 짭게 혹은 길게 설정을 가진 토스트 객체를 만들어서 보여주세요	
        }
    
    }
    
    /* resultListener를 이용한 subActivity 동작 */
    binding.btnStart.setOnClickListener{
    	resultListener.launch(intent)
        // 시작 버튼을 클릭했을 때 정의한 resultListener를 통해서 인텐드를 가지고 런처 합니다.
    }
}

 

 

 

SubActivity
class SubActivity : AppCompatActivity() {

    val binding by lazy { ActivitySubBinding.inflate(layoutInflater) }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        binding.to1.text = intent.getStringExtra("from1")        
        binding.to2.text = "${intent.getIntExtra("from2", 0)}"  

     /* 메인 액티비티로 이동시키기 위해서는 다시 액티비티를 실행하는 것이 아니라
        현재 액티비티를 종료시키면서 돌아간다. */
        
        binding.btnClose.setOnClickListener{
            /* 액티비티 종료 시 리턴해 줄 intent 생성*/
            val returnIntent = Intent()
            returnIntent.putExtra("returnValue", binding.editMessage.text.toString())
            /* 클로즈가 동작하게 되면 담고 싶은 값을 작성
              키값(MainActivity에서 전달한 키값)과 전달할 메세지를 인텐트안에 벨류 값으로 담겠다*/
           
           /* 결과 상태 코드와 인텐트를 넣어 리턴할 값을 셋팅한 뒤 액티비티를 종료한다.*/
            setResult(RESULT_OK, returnIntent) // RESULT_OK : 결과 상태코드
            finish() //전달해줄 값이 있을 경우 intent작성 필요, 전달 값이 없으면 finish()만 작성
        }


    }
}

 

예시3) 실행 결과

 

반응형