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
[code language=”java”]
public interface Communicator {
public void respond(String data);
}
[/code]
2. The layout for MainActivity.java
[code language=”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=".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>
[/code]
3. The MainActivity.java class
[code language=”java”]
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);
}
}
[/code]
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.
[code language=”java”]
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;
}
}
[/code]
5. The FragmentTwo.java class
[code language=”java”]
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);
}
}
[/code]
Search within Codexpedia

Search the entire web
