Динамически добавлять фрагмент во фрагмент - PullRequest
15 голосов
/ 27 октября 2011

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

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

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:

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

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

ll.addView(frml4);

Ответы [ 4 ]

32 голосов
/ 29 октября 2011

Я предполагаю, что проблема, с которой вы сталкиваетесь, заключается в том, что нет раздутого представления для добавления фрагмента, поскольку исходный фрагмент, 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;
    }
}

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

3 голосов
/ 05 ноября 2011

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

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

1 голос
/ 27 октября 2011

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

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

0 голосов
/ 09 марта 2019
@Override     
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity);
    FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.add(R.id.linear1, new activity()).commit();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...