마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

프래그먼트 전환 없이 액티비티에서 프래그먼트로 데이터만 전달하는 방법.

0 추천
        //프래그먼트 전환 없이 데이터만 전달하는 방법이다.
        val ft: FragmentTransaction = supportFragmentManager.beginTransaction()
        ft.add(R.id.container, QuestionActivity(), "tag")

        val f = supportFragmentManager.findFragmentByTag("tag")

        val b = Bundle()
        b.putString("name", "EJ")

        f?.setArguments(b)

뭐가 잘못되었길래, 받는 쪽에서 계속 null을 받아오는지 모르겠습니다.

프래그먼트에 태그를 설정하라고 하시던데, 어떻게 설정하는지 아예 모르겠습니다.

다른 분들 하시는거 보니까, 프래그먼트에 태그를 설정하지 않고, 액티비티에 설정하던데

왜그렇게 하는건지도 모르겠구요. QuestionActivity는 이름만 액티비티이지 실제로는 프래그먼트입니다.

그리고 위에 적힌 코드들은 액티비티에 코딩해놓은 것이구요.

 

아래는 QuestionActivity라는 프래그먼트 파일입니다. 여기에 받는 코드를 썼는데, 받기는 받아지더라고요.

근데, 뭘해도 null만 받아오거나, 공백을 받아오더라구요.

 

val b = getArguments()
val name = b?.getString("name")
Toast.makeText(activity, name, Toast.LENGTH_SHORT).show()

 

상쾌한 (1,890 포인트) 님이 2021년 2월 20일 질문
상쾌한님이 2021년 2월 20일 수정

1개의 답변

+1 추천
 
채택된 답변

addToBackStack과  commit을 잊어버리셨네요,

supportFragmentManager
    .beginTransaction()
    .add(R.id.container, MyFragment(), "tag")
    .addToBackStack(null)
    .commit();
 
val f = supportFragmentManager.findFragmentByTag("tag")
 
val b = Bundle()
b.putString("name", "EJ")
 
f?.setArguments(b)

addToBackStack을 하셔야 fragmentManger각 관리하는 백스택에 생성하신 프레그먼트를 추가해 줍니다.

그리고 프레그먼트 추가/삭제 등등의 동작은 코드에서 알 수 있으니 transaction에 해당하기 때문에

beginTransaction과 commit 사이의 액션을 한번에 수행해 줍니다. 따라서 commit이 없으면 아무 것도 일어나지 않습니다.

그리고 setArgument는 프레그먼 생성시에 값을  디바이스 로테이션 같은 경우에 살아남을 수 있는 값을 전달하기 위해  사용합니다. 님처럼 setArgument 을 호출하시면 받는 쪽에서 언제 값이 세팅되었는지 알 방법이 없습니다.

아래처럼 해당 프레그먼트가 백스택에 존재할 경우 타입캐스팅을 하셔서 해당 프레그먼트에 존재하는 함수를 호출하세요.

val fragment = supportFragmentManager.findFragmentByTag("tag")
if (fragment is MyFragment) {
    fragment.호출할 메소드()
}

 

spark (224,800 포인트) 님이 2021년 2월 20일 답변
상쾌한님이 2021년 2월 20일 채택됨
감사합니다. ^^ 정말 어려운 기술이네요. 이해하기가 어려워요. 간신히 이해한것 같아요. 그러니까 알규먼트랑 번들 부분을 삭제하고, 프래그먼트의 메서드를 호출하는 저 맨밑의 코드들을 대신 기재해 넣으라는 뜻이죠? 호출할 메서드에 인자로써 제가 보내고 싶은 값들을 보내라는 뜻인거죠?
네. 프레그먼트가 특히 복잡한 부분입니다.  다시 확인해 드리자면
addToBackStack(null)
.commit()
이 부분을 프레그먼트를 supportFragmentManager를 통해 add하실 때 마지막에 호출해 주셔야 하구요.
QuestionFragment에 님이 호출할 메소드를 정의하신 다음

class QuestionFragment: Fragment (){

     fun nameChanged(String name) {
          // 원하는 동작
     }
}

val fragment = supportFragmentManager.findFragmentByTag("tag")
if (fragment is QuestionFragment) {
    fragment.nameChanged("EJ")
}
add하는데 어째서 프래그먼트가 전환되지 않는 것인지 의아하지만, 일단 해보겠습니다. 해봤는데, 백스택에 있는 액티비티랑 프래그먼트로 돌아가자마자 바탕화면으로 튕겨져버립니다.
else if (System.currentTimeMillis() - backPressTime < 2000) {
            //프래그먼트 전환 없이 데이터만 전달하는 방법이다.
            supportFragmentManager
                    .beginTransaction()
                    .add(R.id.container, QuestionActivity(), "tag")
                    .addToBackStack(null)
                    .commit()

            val fragment = supportFragmentManager.findFragmentByTag("tag")
            if (fragment is QuestionActivity) {
                fragment.QM("${editText_TextArea?.text}")
            }
            
        
            finish()
        }
죄송한데, 프레그먼트, 백스택, 라이프사이클 등에 대한 기초를 먼저 공부하시고 난 다음에 코딩을 진행하시기를 권장드려요. 안그러면, 지금처럼, 간단한 문제마다 질문을 올리셔야 될지도 몰라요. 그리고 에러가 있는 경우라면 그에 해당하는 로그가 꼭 있을 겁니다. 이걸 잘 분석하셔야 정확한 원인을 알 수 있어요.
잘 설명해주는 책이 있었으면, 제가 벌써 공부를 먼저 하고 있었을텐데, 그런 책을 아직 찾지 못했습니다. 그래서 이렇게 부딪혀가면서 공부하고 있는 것입니다. 그래도 기초를 아예 공부 안한건 아니었어요. 코틀린 책 1권 2번정도 읽긴 했는데, 실제로 코딩 해보지 않으면, 무슨 말씀하시는지 이해가 아예 안가니까요. 지금은 2개월 동안 열심히 코딩해서, 원하는 어플리케이션을 절반 정도 만들었습니다. ^^ 이제 DB도 사용할 줄 알고, 데이터 전달도 어느정도 할 줄 알고, 이벤트 처리라든지, 다방면에서 아주 많이 배운 것 같아요. 그래도 이것 저것 한 번씩은 해보고, 다시 공부하고 싶어요. 어플리케이션 첫 작품인데, 이거 다 만들면, 다시 공부 해보려고요. ^^ Will Kill님 spark님 도와주셔서 감사합니다. ^^
다른 책 보지 마시고 안드로이드 개발자 문서를 먼저 보세요. 결국은 그 문서에 다 나와있습니다. 방대하긴 하지만요.
그거 번역이 조금... 우리 말이랑 이질감이 있더라고요. 대단하시네요. 저는 그거 이해가 잘 안가더라고요. 특히, 테이블 안에 있는 방대한 영어 코드들이 뭘 의미하는지 전혀 모르겠습니다. 너무 방대해서 뭐부터 읽어야할지 포커스를 어디에 맞춰야 할지 감이 안옵니다. 한 번 읽어보겠습니다. ^^ 감사합니다.
한글판은 본 적이 없어서 모르겠지만, 아마도 어색할 거라 생각합니다. 어차피 안드로이드란 용어부터가 한글에는 존재하지 않는 단어이고 쓰이는 용어가 전부 영어이기 때문에 자연스럽기가 힘들 겁니다. 차라리 시간이 걸리시더라도 프로그래밍 관련 자료는 영어가 원본이면 영어공부를 해가면서, 원본을 보는 것이 훨씬 더 좋긴합니다. 한국의 상위 프로그래머들 중에서는 영어 읽는 능력이 남들보다 좋은 분들이 많이 있습니다.
오늘, 답변해주신 것을 다시 한 번 보고 수정해봤는데, 성공했습니다. ^^ 감사합니다. EJ
...