
Question:
i have three tab fragments TAB1,TAB2 and TAB3. On TAB1 there is a button when when clicked it has to send data to TAB2 and TAB3 using interface and display data in the textView in the respective fragment. So far i have managed to send from TAB1 to TAB2,like below
// interface codes
public interface IFragmentToActivity {
void Tab1ToTab2(String value);
}
// in activity
@Override
public void Tab1ToTab2(String value) {
TabFragment2 fragment = (TabFragment2) adapter.getFragment(1);
if (fragment != null) {
fragment.fragmentCommunicationFragment(value);
} else {
// Log.i(LOG_TAG, "Fragment 2 is not initialized");
}
}
/// in TAB1 i send data
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button2:
mCallback.FragmentToFragment("hi from tab 1");
break;
}
}
how can i make it work for all fragments? this is what i have tried when i want to send to TAB2 and 3.
interface codes
public interface IFragmentToActivity {
void Tab1ToTab2(String value);
void Tab1ToTab3(String value);
}
TAB1 send data
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button2:
mCallback.Tab1ToTab2("hi from tab 1");
mCallback.Tab1ToTab3(hi from tab 1");
break;
}
codes in Main Activity to receive
@Override
public void Tab1ToTab2(String value) {
TabFragment2 fragment = (TabFragment2) adapter.getFragment(1);
if (fragment != null) {
fragment.fragmentCommunicationFragment(value);
} else {
// Log.i(LOG_TAG, "Fragment 2 is not initialized");
}
}
@Override
public void Tab1ToTab3(String value) {
TabFragment3 fragment = (TabFragment3) adapter.getFragment(1);
if (fragment != null) {
fragment.FromFragmentOne(value);
}
else {
// Log.i(LOG_TAG, "Fragment 3 is not initialized");
}
}
/// TAB 2 method receive data
public void fragmentCommunicationFragment(String value){
mTextView1.setText(value);
}
/// TAB 3 method receive data
public void FromFragmentOne(String kabila){
mTextView1.setText(kabila);
}
// adapter
public class PagerAdapter extends FragmentStatePagerAdapter {
private final SparseArray<WeakReference<Fragment>> instantiatedFragments = new SparseArray<>();
private ArrayList<String> mTabHeader;
int mNumOfTabs;
public PagerAdapter(FragmentManager fm, int NumOfTabs) {
super(fm);
this.mNumOfTabs = NumOfTabs;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
TabFragment1 tab1 = new TabFragment1();
return tab1;
case 1:
TabFragment2 tab2 = new TabFragment2();
return tab2;
case 2:
TabFragment3 tab3 = new TabFragment3();
return tab3;
case 3:
TabFragment4 tab4 = new TabFragment4();
return tab4;
default:
return null;
}
}
Answer1:In your Tab1ToTab3 method you're instanciating TabFragment3 with your second fragment :
TabFragment3 fragment = (TabFragment3) adapter.getFragment(1);
replace it with
TabFragment3 fragment = (TabFragment3) adapter.getFragment(2);
Answer2:<blockquote>
// Update your getItem() method with this
</blockquote> @Override
public Fragment getItem(int position) {
switch (position) {
case 0:
Bundle bundle = new Bundle();
bundle.putString("YOUR_KEY","YOUR VALUE");
TabFragment1 tab1 = new TabFragment1();
tab1.setArguments(bundle);
return tab1;
case 1:
Bundle bundle2 = new Bundle();
bundle2.putString("YOUR_KEY","YOUR VALUE");
TabFragment2 tab2 = new TabFragment2();
tab2.setArguments(bundle2);
return tab2;
case 2:
Bundle bundle3 = new Bundle();
bundle3.putString("YOUR_KEY","YOUR VALUE");
TabFragment3 tab3 = new TabFragment3();
tab3.setArguments(bundle3);
return tab3;
case 3:
Bundle bundle4 = new Bundle();
bundle4.putString("YOUR_KEY","YOUR VALUE");
TabFragment4 tab4 = new TabFragment4();
tab4.setArguments(bundle4);
return tab4;
default:
return null;
}
<blockquote>
// Under TabFragment1, TabFragment2, TabFragment3, TabFragment4 Override onActivityCreated() to get your data String and setMenuVisibility(boolean menuVisible) to update view
</blockquote> public static String data;
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Bundle bundle = getArguments();
String yourValue = bundle.getString("YOUR_KEY");
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TabFragment1.data="Update";
TabFragment2.data="Update";
TabFragment3.data="Update";
TabFragment4.data="Update";
//update your current View from here
}
});
}
@Override
public void setMenuVisibility(boolean menuVisible) {
super.setMenuVisibility(menuVisible);
if(menuVisible){
//update your current View from here
}
}
by using this you can update all fragments data view from any fragment. click