Smek
Smek

Reputation: 1208

Add Android Fragments dynamically

I created a new fragment that holds two other fragments a right and a left fragment. I called this fragment GridFragment. When i dynamically add GridFragments only the last added fragment is shown. It looks like my GridFragment instance is reused every time I add it. Any ideas why this happens?

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="horizontal"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:weightSum="1.0"><FrameLayout
    android:id="@+id/left_fragment"
    android:layout_height="wrap_content"
    android:layout_weight="0.5"
    android:layout_width="0dip">
</FrameLayout>
<FrameLayout
        android:id="@+id/right_fragment"
        android:layout_height="wrap_content"
        android:layout_weight="0.5"
        android:layout_width="0dip"
        >
</FrameLayout>

public class GridFragment extends Fragment {
private FragmentManager fm;
private FragmentTransaction ft;
private Fragment leftFragment;
private Fragment rightFragment;

private boolean isLeftFragmentSet = false;
private boolean isRightFragmentSet = false;

public GridFragment(Fragment leftFragment, Fragment rightFragment) {
    this.leftFragment = leftFragment;
    this.rightFragment = rightFragment;
}

public Fragment getLeftFragment() {
    return leftFragment;
}

public Fragment getRightFragment() {
    return rightFragment;
}

public boolean isLeftFragmentSet() {
    return isLeftFragmentSet;
}

public boolean isRightFragmentSet() {
    return isRightFragmentSet;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.grid_fragment, container, false);

    fm = getFragmentManager();

    fm.beginTransaction().add(R.id.left_fragment, leftFragment, leftFragment.toString()).commit();
    fm.beginTransaction().add(R.id.right_fragment, rightFragment, rightFragment.toString()).commit();

    return rootView;
}

public void setLeftFragment(Fragment fragment){
    leftFragment = fragment;
    isLeftFragmentSet = true;
}

public void setRightFragment(Fragment fragment){
    rightFragment = fragment;
    isRightFragmentSet = true;
}
}

I want to use this to get a screen filled with wide fragments and two smaller fragments alternately. Here is an example of what I want to achieve:

Grid

Upvotes: 0

Views: 120

Answers (1)

Damian Petla
Damian Petla

Reputation: 9113

I see in your code fundamental mistakes.

First of all rootView is not part of your Activity layout at the time when you request left and right fragments to be added by FragmentManager which is looking for R.id.left_fragment inside Activity layout.

Secondly, if you want nest fragments within fragment you have to use getChildFragmentManager() instead getFragmentManager(). Also make use of FragmentTransaction chain builder, so instead:

fm.beginTransaction().add(R.id.left_fragment, leftFragment, leftFragment.toString()).commit();
fm.beginTransaction().add(R.id.right_fragment, rightFragment, rightFragment.toString()).commit();

call:

fm.beginTransaction().add(R.id.left_fragment, leftFragment, leftFragment.toString())
    .add(R.id.right_fragment, rightFragment, rightFragment.toString())
    .commit();

Maybe you should consider placing your fragments directly inside Activity layout and replace your GridFragment with GridLayout.

Upvotes: 1

Related Questions