«Фрагмент уже активен», когда setArguments() для фрагментации

У меня есть Activity, на котором размещен Fragment.

Файл макета Activity:

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

    <fragment class="com.my.ContentFragment"
        android:id="@+id/fragment_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</FrameLayout>

Java-код Activity:

import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBarActivity;

public class ContentActivity extends ActionBarActivity {

     @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            setContentView(R.layout.activity_main);

            //data from  previous Activity
            Bundle data = getIntent().getExtras();

            Fragment contentFragment = getSupportFragmentManager()
                                                    .findFragmentById(R.id.fragment_content);

            // Pass data to fragment
            /*java.lang.IllegalStateException: Fragment already active*/
            contentFragment.setArguments(data);
        }
...   
}

Я пытаюсь найти фрагмент в onCreate() Activity, а затем передать ему какие-то данные. Но когда я contentFragment.setArguments(data);, я получаю java.lang.IllegalStateException: Fragment already active.

Затем я также проверил contentFragment.getArguments(), который равен нулю. Итак, почему я не могу задать аргументы своему фрагменту?

Если таким образом невозможно передать пакет во фрагмент, как я могу передать пакет во фрагмент?


person user842225    schedule 22.03.2015    source источник


Ответы (2)


Arguments обычно читаются в Fragment.onCreate() .. Если вы раздуваете Fragment from xml layout, то фрагмент уже добавляется через FragmentManager в активность и больше не может принимать аргументы.

Если фрагменту нужны аргументы, вам лучше добавить его в FragmentManager программно, а не с помощью xml. Я рекомендую вам ознакомиться с этим документом, где объясняется правильный фрагмент жизненный цикл и как правильно прикрепить этот фрагмент к активности.

Кстати. вам могут пригодиться FragmentArgs.

person sockeqwe    schedule 22.03.2015
comment
Тогда, как я могу избавиться от него? Я имею в виду, как я могу передать данные Bundle из активности во фрагмент?? - person user842225; 22.03.2015
comment
Вы должны использовать FragmentManager и создать экземпляр фрагмента программно. Я обновил свой ответ. - person sockeqwe; 22.03.2015
comment
@ user842225 что ты имеешь в виду? DetailsFragment создается вручную и добавляется с помощью FragmentManager, как описано в моем ответе. Это не в XML-макете действий. И что? - person sockeqwe; 22.03.2015

Просто используйте FrameLayout в своем XML-файле вместо тега фрагмента. Затем просто создайте новый объект Fragment из onCreate() вашей активности [выше] и вызовите fragment.setArguments(Bundle);.

И внутри onCreate() класса Fragment вызовите getArguments(), который вернет переданный Bundle.

Лучше всего передать пакет Fragment.

person Anish Mittal    schedule 03.03.2016