动态地将片段添加到片段中

时间:2011-10-27 11:48:44

标签: android android-fragments

我无法找到如何将片段动态添加到现有动态添加片段的方法。如果有可能,你知道吗?

我以这种方式生成片段:

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是我在XML中的linearLayout):

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

ll.addView(frml4);

4 个答案:

答案 0 :(得分:32)

我认为您遇到的问题是没有一个膨胀的视图来添加片段,因为原始片段FRAG4_TAG在您尝试添加之前没有被充气。

你可以在Arguments中向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;
    }
}

此示例介绍了您需要将片段动态添加到尚未充气并添加到层次结构中的片段的情况。将片段添加到已经膨胀并添加到层次结构中的片段就像​​通常一样指定要通过ID添加的目标片段容器一样简单。

答案 1 :(得分:3)

正如文档所述“片段必须始终嵌入到活动中”。 因此,当您添加“子片段”时,即使您在片段类中添加它,它也将始终属于该活动。例如,如果您稍后决定删除包含的片段,则不会自动删除子片段。 当我不得不这样做时,我必须在子矢量中存储子片段,并在我的容器片段的onDestroy方法中手动删除它们。

我认为不会像这样使用片段

答案 2 :(得分:1)

您无法将碎片插入其他碎片。 (至少,还没有)

但是,您可以使用FragmentTransaction.replace(containerViewId, Fragment)替换碎片与其他碎片。

答案 3 :(得分:0)

@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();
}