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

activity 실행 전 fragment가 먼저 실행될 경우

0 추천

activity가 fragment에서 버튼을 클릭 시 실행이 됩니다.

activity에서 fragment로 데이터를 보내는데, 

fragment에서는 처음 실행할 때, intent를 통해서 받는데, 

var list: ArrayList<TestData> = 
requireActivity().intent!!.extras!!.get("data") as ArrayList<TestData>

이와 같이 코드를 작성하면, nullpointException이 발생합니다.

null을 체크하고 null이 아닐 경우 실행을 해주고 싶은데, if문을 통해 requireActivity... == null 이렇게 조건을 넣어봤는데

그대로 nullpointException이 뜨네요ㅠㅠ

intent를 받기 전 없으면 그냥 넘어가도록 하려면 어떻게 해야할까요?

hand (1,150 포인트) 님이 2021년 8월 11일 질문

2개의 답변

0 추천
 
채택된 답변

문서를 보면 requireActivity가 이렇게 나와 있습니다.

requireActivity

@NonNull fun requireActivity(): FragmentActivity

Return the FragmentActivity this fragment is currently associated with.

Exceptions
IllegalStateExceptionif not currently associated with an activity or if associated only with a context.

requireActivity()는 Null을 리턴하지 않아요. 대신 IllegalStateException을 떨굽니다. 따라서 requireActivity()가 null이 아니라  intent나  intent.extra, intent.extra.get("data") 중의 하나가 null이 된 거겠죠.

그리고 Fragment는 arguments를 통해 데이터를 주고 받습니다. 따라서 Fragment내에서 전달된 값을 체크하려면  프레그먼ㅌ의 arguments에 통해 값을 보내시거나 아니면, 인터페이스로 프레그먼트를 포함한 액티비티와 통신을 하게 하는 것이 바람직한 방법일 듯 싶습니다. 그리고 프레그먼트 내에서는 onViewCreate가 많은 경우에 뷰를 초기화하거나 하는 등의 로직이 들어가기 적합한 함수입니다.

spark (224,800 포인트) 님이 2021년 8월 11일 답변
hand님이 2022년 7월 3일 채택됨
제가 설계한게 지금 activity에서 Data를 넘겨주는데, fragment가 먼저 실행되서요ㅠ
혹시 fragment에서 작성자님이 말한 intent를 null처리해주려면 어떻게 해야할까요
try catch문으로 lllegalStateException을 처리해주면 될까요?
프레그먼트를 동적으로 추가하셨나요, 아니면 XML에 넣으셨나요?
그리고 다시 말씀드리지만 Activity에서 Fragment로 setArgument를 통해 값을 전달해서 사용하시는 게 맞는 방법이예요. static 변수를 사용하면 안드로이드 시스템 상황에 따라 값이 초기화될 수도 있습니다. 그래서 static 대신에 번거로운 bundle같은 걸 사용하는 겁니다.
+1 추천
저도 해당 문제가 있던 적이 있는데 저는 찾다가 야매로 해결헀어요 ㅠㅠ

야매지만 혹시 도움이 될까 싶어 답변 남겨요!

activity에서 staic으로 값을 0 이런식으로 주고, activity가 생성되면 1로 변환해서 프래그먼트에서 0이면 그냥 넘어가고 1이면 인텐트로 값을 받아오게 했었습니다.
랄라룽 (380 포인트) 님이 2021년 8월 11일 답변
아하 야매긴 해도 그렇게 하는 방법 또한 있겠네요 답변 감사합니다!
...