Hoe voeg ik een fragment toe aan een programmatisch gegenereerde lay-out?

Ik heb de volgende code die fragmenten genereert, maar alleen als ik ze toevoeg aan een lineaire lay-out die in mijn XML-bestand bestaat.

LinearLayout fragmentsLayout = (LinearLayout) findViewById(R.id.foodItemActvity_linearLayout_fragments);
FragmentManager fragMan = getFragmentManager();
FragmentTransaction fragTransaction = fragMan.beginTransaction();
Fragment myFrag= new ImageFragment();
fragTransaction.add(R.id.foodItemActvity_linearLayout_fragments, myFrag , "fragment" + fragCount);
fragTransaction.commit();

Wat nu als ik dat fragment wil toevoegen aan een lineaire lay-out die nog niet bestaat in het XML-bestand, zoals

LinearLayout rowLayout = new LinearLayout();

Deel 2:

   Fragment frag1 = generateAppropriateFragment(type1);
    Fragment frag2 = generateAppropriateFragment(type2);
    LinearLayout fragmentsLayout = (LinearLayout) findViewById(R.id.foodItemActvity_linearLayout_fragments);
    LinearLayout rowLayout = new LinearLayout(this);
    rowLayout.setId(12345); // add counter to end
    fragmentsLayout.addView(rowLayout);     
    getFragmentManager().beginTransaction().add(rowLayout.getId(), frag1, "fragment_grandchild" + fragCount).commit();
    fragCount++;
    getFragmentManager().beginTransaction().add(rowLayout.getId(), frag2, "fragment_grandchild" + fragCount).commit();
    fragCount++;

Antwoord 1, autoriteit 100%

Ik veronderstel dat je op een gegeven moment je programmatisch gemaakte LinearLayout gaat toevoegen aan een of andere hoofdlay-out die je hebt gedefinieerd in .xml.
Dit is slechts een suggestie van mij en waarschijnlijk een van de vele oplossingen, maar het werkt:
Stel eenvoudig een ID in voor de programmatisch gemaakte lay-outen voeg deze toe aan de hoofdlay-out die u hebt gedefinieerd in .xml, en gebruik vervolgens de ingestelde ID om het fragment toe te voegen.

Het zou er zo uit kunnen zien:

LinearLayout rowLayout = new LinearLayout();
rowLayout.setId(whateveryouwantasid);
// add rowLayout to the root layout somewhere here
FragmentManager fragMan = getFragmentManager();
FragmentTransaction fragTransaction = fragMan.beginTransaction();   
Fragment myFrag = new ImageFragment();
fragTransaction.add(rowLayout.getId(), myFrag , "fragment" + fragCount);
fragTransaction.commit();

Gewoon kies de gewenste integerwaardevoor de ID:

rowLayout.setId(12345);

Als u de bovenstaande regel code niet slechts één keer gebruikt, is het waarschijnlijk slim om een manier te bedenken om unieke ID’s te maken, om dubbele codes te vermijden.

UPDATE:

Hier is de volledige code van hoe het moet:
(deze code is getest en werkt)
Ik voeg twee fragmenten toe aan een lineaire lay-out met horizontale oriëntatie, waardoor de fragmenten naast elkaar worden uitgelijnd. Houd er ook rekening mee dat ik een vaste hoogte en breedtevan 200 dp heb gebruikt, zodat één fragment niet het volledige scherm gebruiktzoals bij “match_parent”.

MainActivity.java:

public class MainActivity extends Activity {
    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);     
        LinearLayout fragContainer = (LinearLayout) findViewById(R.id.llFragmentContainer);
        LinearLayout ll = new LinearLayout(this);
        ll.setOrientation(LinearLayout.HORIZONTAL);
        ll.setId(12345);
        getFragmentManager().beginTransaction().add(ll.getId(), TestFragment.newInstance("I am frag 1"), "someTag1").commit();
        getFragmentManager().beginTransaction().add(ll.getId(), TestFragment.newInstance("I am frag 2"), "someTag2").commit();
        fragContainer.addView(ll);
    }
}

TestFragment.java:

public class TestFragment extends Fragment {
    public static TestFragment newInstance(String text) {
        TestFragment f = new TestFragment();
        Bundle b = new Bundle();
        b.putString("text", text);
        f.setArguments(b);
        return f;
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v =  inflater.inflate(R.layout.fragment, container, false);
        ((TextView) v.findViewById(R.id.tvFragText)).setText(getArguments().getString("text"));     
        return v;
    }
}

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/rlMain"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="5dp"
    tools:context=".MainActivity" >
    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
    <LinearLayout
        android:id="@+id/llFragmentContainer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignLeft="@+id/textView1"
        android:layout_below="@+id/textView1"
        android:layout_marginTop="19dp"
        android:orientation="vertical" >
    </LinearLayout>
</RelativeLayout>

fragment.xml:

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="200dp"
    android:layout_height="200dp" >
    <TextView
        android:id="@+id/tvFragText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="" />
</RelativeLayout>

En dit is het resultaat van de bovenstaande code: (de twee fragmenten zijn naast elkaar uitgelijnd)
resultaat


Antwoord 2

Hieronder staat een werkende code om een ​​fragment bijv. 3 keer toe te voegen aan een verticale LinearLayout (xNumberLinear).
Je kunt nummer 3 wisselen met elk ander nummer of een nummer uit een spinner nemen!

for (int i = 0; i < 3; i++) {
            LinearLayout linearDummy = new LinearLayout(getActivity());
            linearDummy.setOrientation(LinearLayout.VERTICAL);
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
                Toast.makeText(getActivity(), "This function works on newer versions of android", Toast.LENGTH_LONG).show();
            } else {
                linearDummy.setId(View.generateViewId());
            }
            fragmentManager.beginTransaction().add(linearDummy.getId(), new SomeFragment(),"someTag1").commit();
            xNumberLinear.addView(linearDummy);
        }

Other episodes