it-swarm.com.de

Wie füge ich ein Fragment zu einem programmgesteuert erzeugten Layout hinzu?

Ich habe folgenden Code, der Fragmente erzeugt, aber nur, wenn ich sie zu einem linearen Layout hinzufüge, das in meiner XML-Datei vorhanden ist.

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

Was ist, wenn ich dieses Fragment zu einem linearen Layout hinzufügen möchte, das in der XML-Datei nicht bereits vorhanden ist, wie z

LinearLayout rowLayout = new LinearLayout();

Teil 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

Irgendwann nehme ich an, Sie werden Ihr programmatisch erstelltes LinearLayout zu einem Stammlayout hinzufügen, das Sie in .xml definiert haben .. Dies ist nur ein Vorschlag von mir und wahrscheinlich eine von vielen Lösungen, aber es funktioniert: Einfach Legen Sie eine ID für das programmgesteuert erstellte Layout fest, und fügen Sie sie dem in .xml definierten Stammlayout hinzu, und anschließend verwenden Sie die Set-ID, um das Fragment hinzuzufügen.

Es könnte so aussehen:

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

Einfach Wählen Sie den gewünschten Integer-Wert für die ID:

rowLayout.setId(12345);

Wenn Sie die obige Codezeile nicht nur einmal verwenden, ist es wahrscheinlich sinnvoll, eine Möglichkeit zum Erstellen eindeutiger IDs zu suchen, um Duplikate zu vermeiden.

UPDATE:

Hier ist der vollständige Code, wie es zu tun ist: (Dieser Code wurde getestet und funktioniert) Ich füge einem LinearLayout zwei Fragmente mit horizontaler Ausrichtung hinzu, sodass die Fragmente nebeneinander ausgerichtet werden gegenseitig. Bitte beachten Sie auch, dass ich habe eine feste Höhe und Breite verwendet von 200dp, so dass ein Fragment verwendet nicht den gesamten Bildschirm wie bei "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>

Und das ist das Ergebnis des obigen Codes: (Die beiden Fragmente sind nebeneinander angeordnet) result

94
Philipp Jahoda

Fügen Sie diesen Code in Ihre Aktivität ein

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

0
bhoomika

Nachfolgend finden Sie einen Arbeitscode, um ein Fragment beispielsweise dreimal zu einem vertikalen LinearLayout (xNumberLinear) ..__ hinzuzufügen. Sie können Nummer 3 mit einer beliebigen anderen Nummer ändern oder eine Nummer von einem Spinner nehmen!

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