Динамически добавлять фрагмент в фрагмент

Мне не удалось найти способ динамического добавления фрагмента в существующий динамически добавленный фрагмент. Знаете ли вы, если это возможно?

Я генерирую фрагменты следующим образом:

FragmentManager fragMgr = getSupportFragmentManager();
FragmentTransaction xact = fragMgr.beginTransaction();

if(null == fragMgr.findFragmentByTag(FRAG1_TAG)) {
   xact.add(10101010, new DateTime(), FRAG1_TAG); 
}

if(null == fragMgr.findFragmentByTag(FRAG4_TAG)) {
   xact.add(7777, new loginForm(), FRAG4_TAG);

}

xact.commit(); 

Как добавить в FRAG4_TAG фрагмент еще один?

Edit2:

Я жестко закодировал его id, чтобы иметь возможность работать с ним в будущем (где ll - мой linearLayout в XML):

FrameLayout frml4 = (FrameLayout)inflater.inflate(R.layout.frame,null);
frml4.setId(7777);
frml4.setBackgroundColor(Color.YELLOW);

ll.addView(frml4);

Ответы

Ответ 1

Я предполагаю, что проблема, с которой вы сталкиваетесь, заключается в том, что не существует расширенного представления для добавления фрагмента, потому что исходный фрагмент FRAG4_TAG не был завышен до того, как вы попытаетесь его добавить.

Вы можете передать достаточную информацию в FRAG4_TAG в Аргументах, чтобы сообщить ей, что она должна создавать и добавлять фрагмент (или все фрагменты, которые вам нужны) для него во время его onCreateView после того, как представление было завышено...

Макет для активности...

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="MyActivity"/>

    <LinearLayout
        android:orientation="vertical"
        android:id="@+id/main_frag_container"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"/>
</LinearLayout>

Активность...

public class MyActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        FragmentManager fm = getFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();

        Fragment fragOne = new MyFragment();
        Bundle arguments = new Bundle();
        arguments.putBoolean("shouldYouCreateAChildFragment", true);
        fragOne.setArguments(arguments);
        ft.add(R.id.main_frag_container, fragOne);
        ft.commit();

    }
}

Макет для фрагмента...

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="20dp">
    <TextView
        android:id="@+id/text"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Some fragment"/>

    <LinearLayout
        android:orientation="vertical"
        android:id="@+id/frag_container"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"/>
</LinearLayout>

Фрагмент...

public class MyFragment extends Fragment {
    @Override
    public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
        ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.frag_layout, container, false);

        boolean shouldCreateChild = getArguments().getBoolean("shouldYouCreateAChildFragment");

        if (shouldCreateChild) {
            FragmentManager fm = getFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();

            fm.beginTransaction();
            Fragment fragTwo = new MyFragment();
            Bundle arguments = new Bundle();
            arguments.putBoolean("shouldYouCreateAChildFragment", false);
            fragTwo.setArguments(arguments);
            ft.add(R.id.frag_container, fragTwo);
            ft.commit();

        }

        return layout;
    }
}

В этом примере рассмотрим случай, когда вам необходимо динамически добавлять фрагменты к фрагменту, который НЕ был задушен и добавлен в иерархию. Добавление фрагмента к фрагменту, который уже был завышен и добавлен в иерархию, так же просто, как просто указать контейнер целевых фрагментов, который вы хотите добавить по идентификатору, как обычно.

Ответ 2

Как указано в документации: "Фрагмент должен быть всегда включен в действие". Поэтому, когда вы добавляете "суб-фрагмент", он всегда будет принадлежать активности, даже если вы добавите его в свой класс фрагментов. Например, если позднее вы решите удалить содержащийся фрагмент, субфрагменты не будут автоматически удалены. Когда мне приходилось делать то же самое, мне пришлось хранить в векторе вспомогательные фрагменты и вручную удалять их в методах onDestroy моего фрагмента контейнера.

Я думаю, что фрагменты, как считается, не используются, как это

Ответ 3

Вы не можете вставлять фрагменты в другие фрагменты. (По крайней мере, еще нет)

Однако вы можете заменить фрагменты другими фрагментами на FragmentTransaction.replace(containerViewId, Fragment).