Почему мой метод onCreateView вызывается дважды?

При отладке другой проблемы я обнаружил, что метод onCreateView одного из моих действий вызывается дважды. Я новичок в программировании и не совсем понимаю, как android вызывает эти методы при загрузке активности, но мне кажется неправильным, что это будет вызываться дважды. Удалив большую часть своего кода, я все еще дважды вижу сообщение System.out.

public class AddCourse extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_course);

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

    public static class AddCourseFragment extends Fragment {

        View rootView;

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
            rootView = inflater.inflate(R.layout.fragment_add_course,
                container, false);
                        System.out.println("I see this TWICE!!!!");
            return rootView;
        }       
    }
}

Это почти то же самое, что и реализация моей основной активности, но она не проходит onCreateView дважды. Мысли?

Был запрошен мой xml activity_add_course...

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

     <fragment android:name="com.NsouthProductions.gradetrackerpro.AddCourse$AddCourseFragment"
         android:id="@+id/AddCourseFrag" 
         android:layout_width="match_parent"
         android:layout_height="match_parent" />
</LinearLayout>

person NSouth    schedule 08.04.2014    source источник
comment
Вы можете поделиться своим файлом макета activity_add_course?   -  person brwngrldev    schedule 08.04.2014
comment
@adavis, я добавил файл макета. Это происходит потому, что файл макета в основном вызывает мой класс фрагмента? Как я должен остановить его от вызова дважды?   -  person NSouth    schedule 08.04.2014
comment
похоже, вы добавляете фрагмент дважды. Если вы объявите его в xml, вам также не нужно добавлять его программно.   -  person brwngrldev    schedule 08.04.2014
comment
@adavis, хм, так из какой части моего кода мне его удалить? Как я могу обработать null saveInstanceState без двойного вызова моего фрагмента? Извините, я все еще пытаюсь понять некоторые из этих основ.   -  person NSouth    schedule 08.04.2014


Ответы (1)


Похоже, вы добавляете фрагмент дважды. Если вы объявите его в xml, вам также не нужно добавлять его программно.

Вы можете удалить это из списка Действий onCreate():

if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new AddCourseFragment()).commit();
        }
person brwngrldev    schedule 08.04.2014
comment
Спасибо. Написав здесь длинный вопрос, я, наконец, пришел к выводу, что код условия saveInstanceState должен гарантировать, что фрагмент будет раздут. Но поскольку основной макет все равно его раздувает, этот код не нужен. Надеюсь, других побочных эффектов нет. Спасибо! - person NSouth; 08.04.2014