Implementing multiple fragments in a single activity Dynamically
All Fragment-to-Fragment communication is done through the associated Activity. Two Fragments should never communicate directly.
http://developer.android.com/training/basics/fragments/communicating.html
test.java
// in your case its MainActivity
public class test extends FragmentActivity implements textEntered { String value; boolean check = false; BottomFragment frg2; FragmentTransaction transaction; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Top_Fragment frg = new Top_Fragment(); frg2 = new BottomFragment(); FragmentManager manager = getSupportFragmentManager(); transaction = manager.beginTransaction(); transaction.add(R.id.My_Container_1_ID, frg, "Frag_Top_tag"); transaction.add(R.id.My_Container_3_ID, frg2, "Frag_Bottom_tag"); transaction.commit(); } @Override public void setValue(String editextvalue) { value = editextvalue; if (frg2 != null) { frg2.setName(value); } else { Toast.makeText(getApplicationContext(), "fragment 2 is null", 1000).show(); } }}
Top_Fragment.java
public class Top_Fragment extends Fragment { textEntered mCallback; Button b; EditText ed; public interface textEntered { public void setValue(String editextvalue); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub View view = inflater.inflate(R.layout.my_fragment1, container, false); ed = (EditText) view.findViewById(R.id.editText1); return view; } @Override public void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); b = (Button) getView().findViewById(R.id.button1); b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub String s = ed.getText().toString(); mCallback.setValue(s); } }); } @Override public void onAttach(Activity activity) { super.onAttach(activity); // This makes sure that the container activity has implemented // the callback interface. If not, it throws an exception try { mCallback = (textEntered) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement textEntered"); } }}
my_fragment1.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <EditText android:id="@+id/editText1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:ems="10" android:textColor="#000000" android:singleLine="true" > <requestFocus /> </EditText> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/editText1" android:layout_centerHorizontal="true" android:layout_marginTop="20dp" android:text="Button" /></RelativeLayout>
Change to
display_text=(TextView) view.findViewById(R.id.textView1); // id is textView 1 not editText1
in BottomFragment
snap
Communication between Fragments
There can be many scenarios where communication between fragment is required. You need to pass data between fragments on button click event. You may also use Android toolbar to switch between fragments. When you add buttons to your toolbar, you need to dynamically change screen using fragment.
Create an interface which will help us to communicate
Communicate.java
package com.example.amaanmemon.testfragment;interface Communicate { public void sendData();}
TopFragment.java
package com.example.amaanmemon.testfragment;import android.support.v4.app.Fragment;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.EditText;public class TopFragment extends Fragment {EditText firstName;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub View view=inflater.inflate(R.layout.my_fragment1, container, false); return view;}public void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); firstName = (EditText) getActivity().findViewById(R.id.editText1);}public String getData(){ return firstName.getText().toString();}}
MiddleFragment.java
package com.example.amaanmemon.testfragment;import android.os.Bundle;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.Button;public class MiddleFragment extends Fragment implements OnClickListener{View view;Button btn;Communicate cm;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub view=inflater.inflate(R.layout.my_fragment2, container, false); return view;}@Overridepublic void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); cm = (Communicate) getActivity(); btn = (Button) getActivity().findViewById(R.id.button1); btn.setOnClickListener(this);}@Overridepublic void onClick(View arg0) { // TODO Auto-generated method stub cm.sendData();}}
BottomFragment.java
package com.example.amaanmemon.testfragment;import android.os.Bundle;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.Button;import android.widget.TextView;public class BottomFragment extends Fragment{int count;View view;TextView display_text;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub view=inflater.inflate(R.layout.my_fragment3, container,false); return view;}@Overridepublic void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); display_text = (TextView)getActivity().findViewById(R.id.textView1);}public void incrementData(String displayText){ display_text.setText(displayText);}}
MainActivity.java
package com.example.amaanmemon.testfragment;import android.support.v4.app.FragmentActivity;import android.os.Bundle;import android.support.v4.app.FragmentManager;import android.support.v4.app.FragmentTransaction;public class MainActivity extends FragmentActivity implements Communicate{TopFragment frg;MiddleFragment frg1;BottomFragment frg2;FragmentTransaction transaction;@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); frg = new TopFragment(); frg1 = new MiddleFragment(); frg2 = new BottomFragment(); FragmentManager manager=getSupportFragmentManager(); transaction=manager.beginTransaction(); transaction.add(R.id.My_Container_1_ID, frg, "Frag_Top_tag"); transaction.add(R.id.My_Container_2_ID, frg1, "Frag_Middle_tag"); transaction.add(R.id.My_Container_3_ID, frg2, "Frag_Bottom_tag"); transaction.commit();}@Overridepublic void sendData() { String temp = frg.getData(); frg2.incrementData(temp);}}
You can copy xml files from question.you can watch the output below.
You can use the Activity for that.
in the onClick of the bottom fragment you can do something like
((MainActivity) getActivity()).doIt();
And make a method doIt
in your MainActivity
maybe something like this
public void doIt(){ frg2.setName(frg.getText())}
and in the top fragment make a method getText
that returns the text of the EditText