Android Fragment Communication Through Activity
This is a demonstration of communications between fragments through an Activity. The Activity acts like a tunnel which connects the fragments. You have two Fragments in an Activity, and Fragment 1 wants to talk to Fragment 2. In this example, Fragment 1 has two Buttons, Fragment 2 has a TextView to display a counter. When a button in Fragment 1 is clicked, the TextView in Fragment 2 has to increase by one or decrease by 1.
A solution to this is to use an Interface class. Make the Activity to implement this interface, Fragment 1 will call the interface method that will be implemented by the Activity class, this method in the Activity class will route the data from Fragment 1 to Fragment 2.
1. The interface Communicator.java
public interface Communicator { public void respond(String data); }
2. The layout for MainActivity.java
<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=".MainActivity" > <fragment android:id="@+id/frag1" android:name="com.example.fragmentintercomm.FragmentOne" android:layout_width="match_parent" android:layout_height="wrap_content"/> <fragment android:id="@+id/frag2" android:name="com.example.fragmentintercomm.FragmentTwo" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/frag1"/> </RelativeLayout>
3. The MainActivity.java class
public class MainActivity extends Activity implements Communicator { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public void respond(String data) { FragmentManager fm = getFragmentManager(); FragmentTwo f2 = (FragmentTwo) fm.findFragmentById(R.id.frag2); f2.updateDisplay(data); } }
4. The FragmentOne.java class with 2 buttons, increment and decrement. When one of the button is clicked, it should update the counter display in in Fragment 2.
public class FragmentOne extends Fragment { private Button incrementBtn; private Button decrementBtn; private int counter = 0; Communicator com; // communication interface object @Override public void onAttach(Activity activity) { super.onAttach(activity); try { com = (Communicator) activity; //Reference to Main Activity } catch (ClassCastException castException) { Log.e("FragmentOne", "MainActivity didn't implement the Communicator interface"); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_one, container,false); incrementBtn = (Button) v.findViewById(R.id.btn1); decrementBtn = (Button) v.findViewById(R.id.btn2); incrementBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { counter++; if (com != null) com.respond("Counter: " + counter); //Call the method in the activity class } }); decrementBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { counter--; if (com != null) com.respond("Counter: " + counter); //Call the method in the activity class } }); return v; } }
5. The FragmentTwo.java class
public class FragmentTwo extends Fragment { TextView tvDisplay; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_two, container,false); tvDisplay = (TextView) v.findViewById(R.id.tv_display); return v; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } public void updateDisplay(String data){ tvDisplay.setText(data); } }
Search within Codexpedia
Search the entire web