I wish to dynamically create a list of fragments programmatically with subviews before adding the fragments. I have a JSON file which sets up each fragment with a list of views, so when my app starts, there is an activity called splash screen which just shows an image while the data is being processed. Quick example below of me trying to generate 3 fragments and set up their subviews (this is in the splash screen activity)
for(int i = 0; i < 3; i++)
{
DefaultFragment frag = new DefaultFragment();
RelativeLayout layout = (RelativeLayout) createUI(frag);
frag.setFragLayout(layout);
}
private RelativeLayout createUI(final DefaultFragment frag_p)
{
RelativeLayout layout = new RelativeLayout(this);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
Button but = new Button(this);
but.setWidth(100);
but.setHeight(100);
but.setText("Next");
but.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0)
{
frag_p.testNextFragment();
}
});
layoutParams.setMargins(100, 100, 0, 0);
layout.addView((View) but, layoutParams);
return layout;
}
Then in the fragment there is a RelativeLayout called fraglayout
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
//took out layout inflator temp, to try using the relativeLayout which was set from the splash screen
// View V = inflater.inflate(R.layout.fraglayout, container, false);
return fragLayout;
}
This allows me to add the subviews to the fragment okay, this test just involves a button that when pressed, takes you to the next fragment which works fine, but when I try to go to previous fragment, I get the error “The specified child already has a parent”.
I know this is because of this
Button but = new Button(this);
It is getting the context of the Splash Screen and not the fragment, but how do I get the context from the fragment before its creation?
Could anyone suggest to me a better method for adding the subViews to fragments prior to them being shown.
Any help would be much appreciated
01-15 12:25:01.598: E/AndroidRuntime(3443): FATAL EXCEPTION: main
01-15 12:25:01.598: E/AndroidRuntime(3443):
java.lang.IllegalStateException: The specified child already has a
parent. You must call removeView() on the child’s parent first. 01-15
12:25:01.598: E/AndroidRuntime(3443): at
android.view.ViewGroup.addViewInner(ViewGroup.java:1976) 01-15
12:25:01.598: E/AndroidRuntime(3443): at
android.view.ViewGroup.addView(ViewGroup.java:1871) 01-15
12:25:01.598: E/AndroidRuntime(3443): at
android.view.ViewGroup.addView(ViewGroup.java:1828) 01-15
12:25:01.598: E/AndroidRuntime(3443): at
android.view.ViewGroup.addView(ViewGroup.java:1808) 01-15
12:25:01.598: E/AndroidRuntime(3443): at
com.single.DefaultFragment.onCreateView(DefaultFragment.java:61) 01-15
12:25:01.598: E/AndroidRuntime(3443): at
android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:870)
01-15 12:25:01.598: E/AndroidRuntime(3443): at
android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080)
01-15 12:25:01.598: E/AndroidRuntime(3443): at
android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622)
01-15 12:25:01.598: E/AndroidRuntime(3443): at
android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416)
01-15 12:25:01.598: E/AndroidRuntime(3443): at
android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:420)
01-15 12:25:01.598: E/AndroidRuntime(3443): at
android.os.Handler.handleCallback(Handler.java:587) 01-15
12:25:01.598: E/AndroidRuntime(3443): at
android.os.Handler.dispatchMessage(Handler.java:92) 01-15
12:25:01.598: E/AndroidRuntime(3443): at
android.os.Looper.loop(Looper.java:123) 01-15 12:25:01.598:
E/AndroidRuntime(3443): at
android.app.ActivityThread.main(ActivityThread.java:3683) 01-15
12:25:01.598: E/AndroidRuntime(3443): at
java.lang.reflect.Method.invokeNative(Native Method) 01-15
12:25:01.598: E/AndroidRuntime(3443): at
java.lang.reflect.Method.invoke(Method.java:507) 01-15 12:25:01.598:
E/AndroidRuntime(3443): at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
01-15 12:25:01.598: E/AndroidRuntime(3443): at
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 01-15
12:25:01.598: E/AndroidRuntime(3443): at
dalvik.system.NativeStart.main(Native Method)
Figured out solution, in my fragment I have an arraylist which holds a list of objects, whenever I click the button to go to next fragment, or back button to go back, I call remove all views on my relative layout, and now it works fine.