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

Fragment BackStack 질문입니다.

0 추천
안녕하세요.

현재 엑티비티 하나를 제외하고 모든 화면을 프래그먼트 단위로 구성하고 있습니다.

예를들어

왼쪽에 슬라이드메뉴에 1번 버튼을 누르면 화면A가 뜨는데요.

트랜잭션 replace로 화면을 액티비티위에 올리고 있습니다.

그리고 addBackStack으로 백스택을 추가해주고 있습니다.

그런데 이렇게 하다보니 1번버튼을 여러번 터치하면 replace라 프래그먼트가 교체되는 개념이긴한데

BackStack이 여러개 쌓여서 그런지

뒤로가기 버튼을 누를시 스택이 여러개 쌓여있어서 여러번 뒤로가기를 눌러야되네요 ㅠㅠ

addBackStack을 할때 이미 동일한 스택이 존재하면 BackStack을 추가 하지 않으면 되는건가요?

조언 부탁드립니다.
갸아악 (21,260 포인트) 님이 2016년 8월 3일 질문

1개의 답변

0 추천
http://stackoverflow.com/questions/17562067/get-the-last-fragment-in-back-stack

여기 보시면

ft.replace(android.R.id.tabcontent, fragment, tag);

ft.addToBackStack(tag);

요렇게 tag를 백스택에 추가 하고,

FragmentManager fm = getSupportFragmentManager();

        for(int entry = 0; entry < fm.getBackStackEntryCount(); entry++){

            String ide = fm.getBackStackEntryAt(entry).getName();

           Log.i("TAG", "Found fragment: " + ide);

        }

이렇게 tag 를 가져와서 이름을 비교하셔도 될것 같고,

0번째를 가져와서 최상위에 있는 프레그먼트만 비교해서 현재 떠있는 화면과 동일하면 추가하지 않는등의 작업을 하면되지 않을까 합니다.

 

꼼수로 boolean값 하나주고 1번 버튼을 누르면 true, replace완료해서 교체되기 전에 false 값으로 바꾸고

true일때 추가 안되게하시면.. 너무 하드코딩스러운가요?ㅎㅎ;;

 

동일한 스택이 존재할때 백스택을 추가하지 않는건 기획적인 의도와 일치하면 그렇게 해주셔도 좋을것 같네요. (같은 화면도 여러개 쌓는게 필요할수 있으니까요.)
캬옹이 (37,920 포인트) 님이 2016년 8월 3일 답변
댓글 정말정말 감사합니다.
일단 제가 생각나는대로 코딩해봤는데 잘 되는지 아직 테스트는 못해봤네요.
말씀해주신거 참고해서 보완하면 될듯 싶습니다.
장문 써주셧는데 정말 감사드려요~

제가 혼자 끄적거려본거 공유합니다.~
캬옹님께서 말씀해주신거 공부해서 보완해볼께요^^

       FragmentTransaction ft = mFragmentManager.beginTransaction();

        String backStateName = pFragment.getClass().getName();
        int backStackEntryCount = mFragmentManager.getBackStackEntryCount();

        if(backStackEntryCount > 0){ //프래그먼트가 1개이상 존재할 경우
            FragmentManager.BackStackEntry backStackEntry = mFragmentManager.getBackStackEntryAt(backStackEntryCount-1);
            String beforeBackStackName = backStackEntry.getName();
            if(!backStateName.equals(beforeBackStackName)){ //이전 백스택과 현재 백스텍이 동일하다면 백스택을 추가하지않고, 동일하지 않다면 추가한다. (중복 스택생성 방지)
                ft.replace(R.id.content_frame, pFragment);
                ft.addToBackStack(backStateName);
            }
        }else{ //최초 프래그먼트 세팅시
            ft.replace(R.id.content_frame, pFragment);
            ft.addToBackStack(backStateName);
        }
        ft.commit();
...