라떼는말이야

[Android] 현재 고민 중인 문제 : 화면 갱신 문제 (해결) 본문

안드로이드

[Android] 현재 고민 중인 문제 : 화면 갱신 문제 (해결)

MangBaam 2021. 5. 28. 16:15
반응형

 

해결 과정

- 안드로이드 카페, 안드로이드 질문 카톡방, 구글링 등 여러 방법을 시도해봤지만 확실한 해결책을 찾지 못함.

- 친구와 코드리뷰를 하며 문제점을 발견하고 해결할 수 있었음

 

문제 원인

문제의 원인은 프래그먼트를 다루는 것에 대한 미숙함 때문이었다.

우선 착각한 부분이 프래그먼트에 있는 EditText에 글자를 입력하고 다음 프래그먼트로 넘어갔다가 돌아오면 기존에 입력했던 글자가 그대로 남아있었기에 단순히 TextView에 setText를 하고 화면이 갱신 안 된 문제로 판단했다.

하지만 내가 프래그먼트를 새로 생성했던 것.

onChangeFragment 함수에서 signInPage2 = new RegisterFragment2();로 새로운 프래그먼트 객체를 생성하고 그 객체를 갖다 붙인 것이었다.

그리고 또 다른 문제는 트랜젝션에서 replace를 한 것이다.

replace를 하게 되면 기존의 프래그먼트를 다른 프래그먼트로 '교체'한다. 즉 기존에 붙어있던 프래그먼트를 떼어버리는 것이다.

내가 setText를 했던 TextView가 붙어있는 프래그먼트는 TextView에 값이 설정 됐지만 프래그먼트 자체가 떨어졌기 때문에 TextView의 값이 갱신되지 않았던 것이다.

 

해결 방법

  • onChangeFragment에서 FragmentManager.beginTransaction().replace(R.id.container, signInPage2).commit(); 에서FragmentManager.beginTransaction().add(R.id.container, signInPage2).commit(); 로 변경했고,
  • 각 프래그먼트가 null인지 확인하여 null이라면 새로운 프래그먼트 객체를 생성하고, 그렇지 않다면 기존의 객체를 사용하도록 구조를 변경.

onChangeFragment()

 

또 하나 새로 안 사실은 트랜젝션에 관한 부분이다.

나는 FragmentManager manager로 선언 후, FragmentTransaction transation = manager.beginTransaction(); 으로 선언해서 transaction을 여러 곳에서 재사용한 것이다.

그렇게 여러 곳에서 commit() 명령을 때렸고, 이 때문에 이미 추가된 프래그먼트라는 오류가 발생하기도 했다.

 

반응형
Comments