How do I add a Fragment to an Activity with a programmatically created content view How do I add a Fragment to an Activity with a programmatically created content view android android

How do I add a Fragment to an Activity with a programmatically created content view


It turns out there's more than one problem with that code. A fragment cannot be declared that way, inside the same java file as the activity but not as a public inner class. The framework expects the fragment's constructor (with no parameters) to be public and visible. Moving the fragment into the Activity as an inner class, or creating a new java file for the fragment fixes that.

The second issue is that when you're adding a fragment this way, you must pass a reference to the fragment's containing view, and that view must have a custom id. Using the default id will crash the app. Here's the updated code:

public class DebugExampleTwo extends Activity {    private static final int CONTENT_VIEW_ID = 10101010;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        FrameLayout frame = new FrameLayout(this);        frame.setId(CONTENT_VIEW_ID);        setContentView(frame, new LayoutParams(            LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));        if (savedInstanceState == null) {            Fragment newFragment = new DebugExampleTwoFragment();            FragmentTransaction ft = getFragmentManager().beginTransaction();            ft.add(CONTENT_VIEW_ID, newFragment).commit();        }    }    public static class DebugExampleTwoFragment extends Fragment {        @Override        public View onCreateView(LayoutInflater inflater, ViewGroup container,                Bundle savedInstanceState) {            EditText v = new EditText(getActivity());            v.setText("Hello Fragment!");            return v;        }    }}


Here is what I came up with after reading Tony Wong's comment:

public class DebugExampleTwo extends BaseActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        addFragment(android.R.id.content,                    new DebugExampleTwoFragment(),                    DebugExampleTwoFragment.FRAGMENT_TAG);    }}

...

public abstract class BaseActivity extends Activity {    protected void addFragment(@IdRes int containerViewId,                               @NonNull Fragment fragment,                               @NonNull String fragmentTag) {        getSupportFragmentManager()                .beginTransaction()                .add(containerViewId, fragment, fragmentTag)                .disallowAddToBackStack()                .commit();    }    protected void replaceFragment(@IdRes int containerViewId,                                   @NonNull Fragment fragment,                                   @NonNull String fragmentTag,                                   @Nullable String backStackStateName) {        getSupportFragmentManager()                .beginTransaction()                .replace(containerViewId, fragment, fragmentTag)                .addToBackStack(backStackStateName)                .commit();    }}

...

public class DebugExampleTwoFragment extends Fragment {    public static final String FRAGMENT_TAG =         BuildConfig.APPLICATION_ID + ".DEBUG_EXAMPLE_TWO_FRAGMENT_TAG";    // ...}

Kotlin

If you are using Kotlin make sure to take a look at what the Kotlin extensions by Google provide or just write your own.


    public class Example1 extends FragmentActivity {        @Override        protected void onCreate(Bundle savedInstanceState) {            super.onCreate(savedInstanceState);          DemoFragment fragmentDemo = (DemoFragment)           getSupportFragmentManager().findFragmentById(R.id.frame_container);          //above part is to determine which fragment is in your frame_container          setFragment(fragmentDemo);                       (OR)          setFragment(new TestFragment1());        }        // This could be moved into an abstract BaseActivity         // class for being re-used by several instances        protected void setFragment(Fragment fragment) {            FragmentManager fragmentManager = getSupportFragmentManager();            FragmentTransaction fragmentTransaction =                 fragmentManager.beginTransaction();            fragmentTransaction.replace(android.R.id.content, fragment);            fragmentTransaction.commit();        }    }

To add a fragment into a Activity or FramentActivity it requires a Container. That container should be a "Framelayout", which can be included in xml or else you can use the default container for that like "android.R.id.content" to remove or replace a fragment in Activity.

main.xml

<RelativeLayout    android:layout_width="match_parent"    android:layout_height="match_parent" > <!-- Framelayout to display Fragments -->   <FrameLayout        android:id="@+id/frame_container"        android:layout_width="match_parent"        android:layout_height="match_parent" />    <ImageView        android:id="@+id/imagenext"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentBottom="true"        android:layout_alignParentRight="true"        android:layout_margin="16dp"        android:src="@drawable/next" /></RelativeLayout>