Le code suivant fonctionne, il génère des fragments, mais uniquement si je les ajoute à une présentation linéaire existant dans mon fichier XML.
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();
Maintenant, si je veux ajouter ce fragment à une présentation linéaire qui n’existe pas déjà dans le fichier XML tel que
LinearLayout rowLayout = new LinearLayout();
Partie 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++;
À un moment donné, j'imagine que vous allez ajouter votre LinearLayout créé par programme à une mise en page racine que vous avez définie dans .xml .définissez un identifiant pour la présentation créée par programme}, ajoutez-le à la présentation racine que vous avez définie dans le fichier .xml, puis utilisez l'identifiant défini pour ajouter le fragment.
Cela pourrait ressembler à ceci:
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();
Simplement choisissez la valeur Integer de votre choix pour l'ID:
rowLayout.setId(12345);
Si vous utilisez la ligne de code ci-dessus non pas une fois, il serait probablement judicieux de trouver un moyen de créer des ID uniques, afin de éviter les doublons.
METTRE À JOUR:
Voici le code complet de la procédure à suivre: (Ce code est testé et fonctionne) J'ajoute deux fragments à un objet LinearLayout avec une orientation horizontale, ce qui entraîne l'alignement des fragments à côté de L'un et l'autre. Sachez également que j'ai utilisé une hauteur et une largeur fixes de 200dp, de sorte que un fragment n'utilise pas le plein écran comme avec "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>
Et ceci est le résultat du code ci-dessus: (les deux fragments sont alignés l'un à côté de l'autre)
Ajoutez ce code dans votre activité
FragmentTransaction mFragmentTransaction = getSupportFragmentManager (). BeginTransaction (); mFragmentTransaction.add (R.id.fr_container, new ProductListFragment ()); mFragmentTransaction.commit ();
Vous trouverez ci-dessous un code de travail permettant d’ajouter un fragment, par exemple 3 fois, à un LinearLayout vertical (xNumberLinear) . Vous pouvez changer le numéro 3 avec n’importe quel autre nombre ou prendre un nombre à partir du disque!
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);
}