[안드로이드 스튜디오] 프래그먼트간 화면전환시 데이터 보존하기

조회수 1726회

이미지

현재 이러한 내비게이션 드로어로 구성된 화면이 있습니다.

여기서 영화 포스터가 보이는 해당화면은 프래그먼트이고, 이 프래그먼트는 viewpager2로 구현되어있습니

다. viewpager2를 구성하는 아이템들은 리사이클러뷰로 구성되어있습니다

여기서 상세보기 버튼 클릭시

이미지

이러한 화면으로 이동됩니다. 상세보기 화면입니다

이 화면 또한 프래그먼트입니다. 즉 프래그먼트-> 프래그먼트간의 화면전환입니다.

이 화면을 스크롤해 내려보면

이미지

이러한 화면이 나옵니다. 모두보기, 작성하기 등 기능들이 있습니다. 모두보기는

모든 리뷰댓글들을 보여주며, 작성하기 버튼은 리뷰를 작성할 수 있는 액티비입니다.

문제는 맨 첫사진인 영화목록 프래그먼트 화면에서 상세보기 화면으로 전환후에

이미지

이 햄버거메뉴를 통해 다시 영화목록으로 돌아가고 나서 다시 상세보기 버튼을 누르면 프래그먼트의 전환이 되질 않습니다. 꼭 상세보기 화면으로 가지 않더라도, 영화목록 프래그먼트에서 다른 프래그먼트 전환후 다시 영화목록 프래그먼트로 돌아오고 상세보기 프래그먼트로 전환해도 같은 현상이 일어납니다

코드입니다.


public class MovieList extends AppCompatActivity implements FragmentCallback {
    private AppBarConfiguration mAppBarConfiguration;
    MovieDetailFragment movieDetailFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.movie_list);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        NavigationView navigationView = findViewById(R.id.nav_view);
        AppBarLayout actionBar = findViewById(R.id.appbar);

//       movieDetailFragment = new MovieDetailFragment();

        mAppBarConfiguration = new AppBarConfiguration.Builder(
                R.id.nav_movie, R.id.nav_gallery, R.id.nav_slideshow)
                .setDrawerLayout(drawer)
                .build();
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
        NavigationUI.setupWithNavController(navigationView, navController);
    }

    @Override
    public boolean onSupportNavigateUp() {
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        return NavigationUI.navigateUp(navController, mAppBarConfiguration)
                || super.onSupportNavigateUp();
    }

    // 상세보기화면으로 전환하는 화면
    public void replaceFragement() {
//        getSupportFragmentManager().beginTransaction().replace(R.id.nav_host_fragment, movieDetailFragment).commit();
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        movieDetailFragment = new MovieDetailFragment();
        ft.replace(R.id.nav_host_fragment, movieDetailFragment);
        ft.addToBackStack(null);
        ft.commit();
        Log.d("MovieList.java", "replaceFragement() 호출");
    }
}

보시면 onCreate() 내에 movieDetailFragment = new MovieDetailFragment(); 이 코드가 주석처리 되어있고 replaceFragment()내에도 있는데 onCreate()에 있는게 원래 코드입니다.

원래 코드로 진행하면 함수호출만되고 프래그먼트의 전환이 이루어지지 않습니다.

원래 코드로 했을때 화면전환이 딱한번만 이루어지고 다시 돌아와서는 왜 안되는지 잘모르겠습니다.

이유좀 알려주세요...ㅜㅜ

그래서 지금 코드처럼 replaceFragment()옮겼더니 정상적적으로 잘 작동은되나.

함수를 호출할때마다 프래그먼트를 새로 생성해내니 기존에 프래그먼트 전환을해서

썼던 리뷰등이 모두 새로 초기화가 되어버립니다..

어떻게하면 화면전환도 계속되고 전환시에 썼던 리뷰등의 데이터를 유지할 수 있을까요?

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)