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

MainActivity에서 onCreate()에 의해 Fragment가 이중으로 생성되는 문제

0 추천

안드로이드 질문입니다. Udacity에서 Developing Android Apps를 공부하고 있습니다.

MainActivity에서 onCreate()에 의해 Fragment가 이중으로 생성되는 문제인데요.

 

image


검색을 해본 결과 예제에서는 MainActivity.java의 onCreate()에 다음 코드를 삽입하는데 최신 버전의 Android Studio가 XML 파일에 자동으로 코드를 삽입하기 때문에 Fragment가 Activity에 겹쳐지는 것이라고 합니다.

 

if (savedInstanceState == null) {
           getSupportFragmentManager().beginTransaction()
                   .add(R.id.fragment, new ForecastFragment())
                   .commit();
}

 

해결책은 의외로 간단한데 해당 코드를 삭제하면 됩니다.;;

 

문제는… 진도를 더 나가다보니 Fragment Tag를 이용해서 Fragment를 호출하는 과정에 와 보니 이 부분을 간단히 삭제하기가 어렵다는 점입니다. 실제 코드는 이렇게 들어가야 하는데 역시나 위와 같이 Fragment가 중복되는 현상이 벌어집니다.

 

@Override

protected void onCreate(Bundle savedInstanceState) {
  mLocation = Utility.getPreferredLocation(this);
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  if (savedInstanceState == null) {
      getSupportFragmentManager().beginTransaction()
              .add(R.id.fragment, new ForecastFragment(), FORECASTFRAGMENT_TAG)
              .commit();
  }
}


Fragment가 중복되지 않도록 Fragment Tag를 사용할 수 있는 방법 없을까요?

최강로떼 (260 포인트) 님이 2015년 9월 22일 질문

2개의 답변

+1 추천

.add 가 아니라  .replace 를 쓰면 되긴한데, 질문이 정확히 어떤 문제 때문인지 파악이 안되네요 

쎄미 (162,410 포인트) 님이 2015년 9월 22일 답변
https://github.com/udacity/Sunshine-Version-2/compare/4.22_fix_details_view...4.23_fix_settings

이런 형태로 코드를 수정했는데 Fragment가 중복해서 나타나는 문제입니다. .replace를 시도해보긴 했는데 결과는 같았어요. 그런데 생각해보니 DB 내용을 삭제한 다음 했어야 하는데 그러지 못했던 거 같아요. 앱을 완전히 제거하고 다시 시작해보려고 합니다.
중복해서 나타난다는게 이해가 안되지만, db와 상관이 있을 것 같지는 않네요
그런가요? 알겠습니다. 일단 다시 시도해보고 결과를 다시 포스팅하겠습니다. 답변 주셔서 고맙습니다.
0 추천

문제 해결했습니다. activity 추가하는 과정에서 android studio가 다음과 같이 fragment를 자동으로 생성해놨는데

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container"
android:name="com.shinjaehun.sunshine.ForecastFragment" tools:layout="@layout/fragment_main"
android:layout_width="match_parent" android:layout_height="match_parent" />

onCreate 과정에서 <fragment> 엘리먼트를 추가해버리기 때문에 벌어지는 일이었습니다. FragmentManager를 사용하지 않거나 레이아웃을 그냥 비어있는 <FrameLayout>으로 바꾸면 해결되는 문제였습니다.

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent" android:layout_height="match_parent" />

도움 주신 쎄미님께 감사드립니다.

최강로떼 (260 포인트) 님이 2015년 9월 23일 답변
...