MainActivity.java
package com.jamesfroggatt.fragmenttransactiondemo.app;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity implements FragmentManager.OnBackStackChangedListener{
FragmentManager manager;
TextView text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
manager=getFragmentManager();
text= (TextView) findViewById(R.id.message);
manager.addOnBackStackChangedListener(this);
}
public void addA(View v){
// create object of the fragment
FragmentA f1 = new FragmentA();
// reference to our fragment manager
FragmentTransaction transaction=manager.beginTransaction();
transaction.add(R.id.group,f1,"A");
// ADD TRANSACTION TO THE BACKSTACK BEFORE COMMITTING THE TRANSACTION
transaction.addToBackStack("addA");
transaction.commit();
}
public void addB(View v){
// create object of the fragment
FragmentB f2 = new FragmentB();
// reference to our fragment manager
FragmentTransaction transaction=manager.beginTransaction();
transaction.add(R.id.group,f2,"B");
// ADD TRANSACTION TO THE BACKSTACK BEFORE COMMITTING THE TRANSACTION
transaction.addToBackStack("addB");
transaction.commit();
}
public void removeA(View v){
// we can only remove A if it's there so we have to find fragment A
FragmentA f1= (FragmentA) manager.findFragmentByTag("A");
FragmentTransaction transaction=manager.beginTransaction();
// we need to check if it's there or not before doing the transaction
// so we don't crash the app if it's not there
if (f1!=null) {
transaction.remove(f1);
// ADD TRANSACTION TO THE BACKSTACK BEFORE COMMITTING THE TRANSACTION
transaction.addToBackStack("removeA");
transaction.commit();
} else {
Toast.makeText(this,"Fragment A was not added before",Toast.LENGTH_SHORT).show();
}
}
public void removeB(View v){
// we can only remove A if it's there so we have to find fragment A
FragmentB f2= (FragmentB) manager.findFragmentByTag("B");
FragmentTransaction transaction=manager.beginTransaction();
// we need to check if it's there or not before doing the transaction
// so we don't crash the app if it's not there
if (f2!=null) {
transaction.remove(f2);
// ADD TRANSACTION TO THE BACKSTACK BEFORE COMMITTING THE TRANSACTION
transaction.addToBackStack("removeB");
transaction.commit();
} else {
Toast.makeText(this,"Fragment B was not added before",Toast.LENGTH_SHORT).show();
}
}
public void replaceAwithB(View v){
FragmentB f2= new FragmentB();
FragmentTransaction transaction=manager.beginTransaction();
transaction.replace(R.id.group,f2,"B");
// ADD TRANSACTION TO THE BACKSTACK BEFORE COMMITTING THE TRANSACTION
transaction.addToBackStack("replaceAwithB");
transaction.commit();
}
public void replaceBwithA(View v){
FragmentA f1= new FragmentA();
FragmentTransaction transaction=manager.beginTransaction();
transaction.replace(R.id.group,f1,"A");
// ADD TRANSACTION TO THE BACKSTACK BEFORE COMMITTING THE TRANSACTION
transaction.addToBackStack("replaceBwithA");
transaction.commit();
}
public void attachA(View v){
FragmentA f1= (FragmentA) manager.findFragmentByTag("A");
FragmentTransaction transaction=manager.beginTransaction();
if (f1!=null) {
transaction.attach(f1);
// ADD TRANSACTION TO THE BACKSTACK BEFORE COMMITTING THE TRANSACTION
transaction.addToBackStack("attachA");
transaction.commit();
}
}
public void detachA(View v){
FragmentA f1= (FragmentA) manager.findFragmentByTag("A");
FragmentTransaction transaction=manager.beginTransaction();
if (f1!=null) {
// detach just HIDES the fragment, it doesn't destroy it completely
// only onPause(), onStop(), onDestroy() are called
transaction.detach(f1);
// ADD TRANSACTION TO THE BACKSTACK BEFORE COMMITTING THE TRANSACTION
transaction.addToBackStack("detachA");
transaction.commit();
}
}
public void back(View v){
manager.popBackStack();
}
public void popAddB(View v){
// removes all the recent transactions down the the addB transaction
manager.popBackStack("addB",0);
// removes all the recent transactions down the the addB transaction INCLUDING the add B
// transaction
//manager.popBackStack("addB",FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
@Override
public void onBackStackChanged() {
text.setText(text.getText()+"\n");
text.setText(text.getText()+" Current status of the backstack: \n");
int count=manager.getBackStackEntryCount();
for (int i=count-1; i>=0; i--){
FragmentManager.BackStackEntry entry=manager.getBackStackEntryAt(i);
text.setText(text.getText()+" "+entry.getName()+" \n");
}
text.setText(text.getText()+"\n");
}
}
FragmentA.java
package com.jamesfroggatt.fragmenttransactiondemo.app;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class FragmentA extends Fragment {
@Override
public void onAttach(Activity activity) {
Log.d("James","Fragment A onAttach");
super.onAttach(activity);
}
@Override
public void onCreate(Bundle savedInstanceState) {
Log.d("James","Fragment A onCreate");
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_a, container, false);
Log.d("James","Fragment A onCreateView");
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.d("James","Fragment A onActivityCreated");
}
@Override
public void onPause() {
super.onPause();
Log.d("James","Fragment A onPause");
}
@Override
public void onStop() {
super.onStop();
Log.d("James","Fragment A onStop");
}
@Override
public void onResume() {
super.onResume();
Log.d("James","Fragment A onResume");
}
@Override
public void onDestroyView() {
super.onDestroyView();
Log.d("James","Fragment A onDestroyView");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("James","Fragment A onDestroy");
}
@Override
public void onDetach() {
super.onDetach();
Log.d("James","Fragment A onDetach");
}
}
FragmentB.java
package com.jamesfroggatt.fragmenttransactiondemo.app;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class FragmentB extends Fragment {
@Override
public void onAttach(Activity activity) {
Log.d("James", "Fragment B onAttach");
super.onAttach(activity);
}
@Override
public void onCreate(Bundle savedInstanceState) {
Log.d("James","Fragment B onCreate");
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_b, container, false);
Log.d("James","Fragment B onCreateView");
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.d("James","Fragment B onActivityCreated");
}
@Override
public void onPause() {
super.onPause();
Log.d("James","Fragment B onPause");
}
@Override
public void onStop() {
super.onStop();
Log.d("James","Fragment B onStop");
}
@Override
public void onResume() {
super.onResume();
Log.d("James","Fragment B onResume");
}
@Override
public void onDestroyView() {
super.onDestroyView();
Log.d("James","Fragment B onDestroyView");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("James","Fragment B onDestroy");
}
@Override
public void onDetach() {
super.onDetach();
Log.d("James","Fragment B onDetach");
}
}
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${packageName}.${activityClass}">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="AddA"
android:onClick="addA"
android:id="@+id/button"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="RemoveA"
android:onClick="removeA"
android:id="@+id/button2"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/button" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ReplaceAwithB"
android:onClick="replaceAwithB"
android:id="@+id/button3"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/button2" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="AddB"
android:onClick="addB"
android:id="@+id/button4"
android:layout_below="@+id/button"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="RemoveB"
android:onClick="removeB"
android:id="@+id/button5"
android:layout_alignTop="@+id/button4"
android:layout_toRightOf="@+id/button4" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ReplaceBwithA"
android:onClick="replaceBwithA"
android:id="@+id/button6"
android:layout_alignTop="@+id/button5"
android:layout_toRightOf="@+id/button5" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="AttachA"
android:onClick="attachA"
android:id="@+id/button7"
android:layout_below="@+id/button4"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="DetachA"
android:onClick="detachA"
android:id="@+id/button8"
android:layout_alignTop="@+id/button7"
android:layout_toRightOf="@+id/button7" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="back"
android:onClick="back"
android:id="@+id/button9"
android:layout_below="@+id/button7"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Pop Add B"
android:onClick="popAddB"
android:id="@+id/button10"
android:layout_below="@+id/button7"
android:layout_toRightOf="@+id/button9"/>
<!-- fragments will be put in this linear layout below -->
<!-- the linear layout will be the CONTAINER for the fragments -->
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignParentRight="true"
android:layout_below="@+id/button9"
android:layout_alignParentBottom="true">
<LinearLayout
android:orientation="vertical"
android:layout_weight="1"
android:layout_width="0dp"
android:background="#FFeeee"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_below="@+id/button10"
android:id="@+id/group"
></LinearLayout>
<ScrollView
android:layout_width="0dp"
android:background="#CCDDFF"
android:layout_height="match_parent"
android:layout_weight="1">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:id="@+id/message" />
</ScrollView>
</LinearLayout>
</RelativeLayout>
fragment_a.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#AA66DD">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFF"
android:text="This is FRAGMENT A"
android:id="@+id/textView1"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true" />
</LinearLayout>
fragment_b.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFBB00">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000"
android:text="This is FRAGMENT B"
android:id="@+id/textView2"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true" />
</LinearLayout>
Notes from Vivz slide nerd videos at youtube