Reputation: 1208
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:
Upvotes: 0
Views: 120
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