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

Android 动态地将片段添加到片段中,android,android-fragments,Android,Android Fragments,我还没有找到一种方法来动态地将片段添加到现有的动态添加的片段中。如果可能的话,你知道吗 我以这种方式生成片段: FragmentManager fragMgr = getSupportFragmentManager(); FragmentTransaction xact = fragMgr.beginTransaction(); if(null == fragMgr.findFragmentByTag(FRAG1_TAG)) { xact.add(10101010, new DateTi

我还没有找到一种方法来动态地将片段添加到现有的动态添加的片段中。如果可能的话,你知道吗

我以这种方式生成片段:

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_标签片段中添加另一个

编辑2:

我硬编码了它的id,以便将来能够使用它(ll是我的XML线性布局):


不能将片段插入到其他片段中。(至少,还没有)


但是,您可以使用FragmentTransaction.replace(containerWebID,Fragment)将片段替换为其他片段。我假设您遇到的问题是,没有可添加片段的膨胀视图,因为原始片段FRAG4\u标记在您尝试添加它之前尚未膨胀

您可以在参数中向FRAG4_标记传递足够的信息,让它知道在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指定要添加到的目标片段容器。

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


我认为碎片不应该像这样使用

你试过了吗?我不认为这是可能的,因为这个片段不能包含其他片段。。。为此使用视图(我面对的是同样的isuse…我已经有了片段让我们调用em LeftListView和DetailsPane现在我有了ViewPager DetailsPane…所以我为每个Pager页面构建了片段…但它总是以事务提交错误结束…经过一些研究,我发现这是的,我尝试过,但没有成功。感谢评论,检查是否is解决方案适合您。这是在另一个片段中插入use fragment的一种变通方法。我完全同意这一点。我上面的示例不处理清理。您必须在这一方面做自己的功课。请确保使用getChildFragmentManager而不是getFragmentManager来添加子片段。您为什么要调用BeginTranssaction()两次?这是我的疏忽。很好。纠正了。你能用这样的方法在一个片段中添加两个片段吗?这是在一个活动中添加一个片段的方法,并不能以任何方式回答这个问题。
@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();
}
@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();
}