web-dev-qa-db-fra.com

Comment ajouter un fragment à une mise en page générée par programme?

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++;
47
Zapnologica

À 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) result

94
Philipp Jahoda

Ajoutez ce code dans votre activité

FragmentTransaction mFragmentTransaction = getSupportFragmentManager (). BeginTransaction (); mFragmentTransaction.add (R.id.fr_container, new ProductListFragment ()); mFragmentTransaction.commit ();

0
bhoomika

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);
        }
0
Farmaker