Динамический обмен данными между дочерними фрагментами
Существует действие, которое имеет фрагменты и их дочерние фрагменты. Динамически создаваемый массив строк необходимо обменивать между двумя дочерними фрагментами. Но, что бы я ни использовал для этого, оно вернулось null
каждый раз.
Я также использовал пользовательские реализации интерфейса, хотя они были болезненными в моем дизайне. Если вы можете предложить какое-либо решение для этой проблемы, я буду признателен.
Fragment-X и Fragment-Y определены в адаптере ViewPager и onPauseFragment()
а также onResumeFragment()
методы реализованы на заказ OnPageChangeListener()
интерфейсный метод.
public class Fragment_X extends SherlockListFragment implements FragmentLifecycle
{
...
@Override
public void onPauseFragment()
{
String[] outpuStringArray = {"text1","tex2"};
Fragment_X fragment = new Fragment_X();
Bundle bundle = new Bundle();
bundle.putStringArray("selectedItems", outputStringArray);
fragment.setArguments(bundle);
Log.d("posted bundle", String.valueOf(bundle));
bus = new Bus();
bus.post(bundle);
}
...
}
Fragment_Y должен принимать пакетное сообщение, когда позиция элемента ViewPager изменилась
public class Fragment_Y extends SherlockListFragment implements FragmentLifecycle
{
...
private static String[] list_subject_name;
...
@Override
public void onResumeFragment()
{
Bundle bundle = getArguments();
Log.d("received bundle", String.valueOf(bundle));
if(getArguments()!=null)
{
list_subject_name = bundle.getStringArray("selectedItems");
} else {
list_subject_name = new String[] {""};
}
bus = new Bus();
bus.register(this);
}
...
}
FragmentLifecycle
класс интерфейса для управления изменением состояния между фрагментами
public interface FragmentLifecycle {
public void onPauseFragment();
public void onResumeFragment();
...
}
EDIT
: ViewPager адаптер
public class ViewPagerAdapter extends FragmentPagerAdapter
{
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
// Declare the number of ViewPager pages
final int PAGE_COUNT = 3;
private String titles[] = new String[] { "Fragment_X", "Fragment_Y", "Fragment_Z" };
@Override
public Fragment getItem(int position)
{
switch (position)
{
case 0:
Fragment_X tab1 = new Fragment_X();
return tab1;
case 1:
Fragment_Y tab2 = new Fragment_Y();
return tab2;
case 2:
Fragment_Z tab3 = new Fragment_Z();
return tab3;
}
return null;
}
public CharSequence getPageTitle(int position)
{
return titles[position];
}
@Override
public int getCount()
{
return PAGE_COUNT;
}
}
EDIT:
Fragment_B
public class Fragment_B extends SherlockFragment
{
private ViewPagerAdapter pageAdapter;
public void onAttach(FragmentActivity activity)
{
super.onAttach(activity);
setHasOptionsMenu(false);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.layout_fragment_viewpager, container, false);
pageAdapter = new ViewPagerAdapter(getChildFragmentManager());
ViewPager mViewPager = (ViewPager) view.findViewById(R.id.registrationViewPager);
mViewPager.setAdapter(pageAdapter);
mViewPager.setOnPageChangeListener(pageChangeListener);
return view;
}
private OnPageChangeListener pageChangeListener = new OnPageChangeListener() {
int currentPosition = 0;
@Override
public void onPageSelected(int newPosition) {
FragmentLifecycle fragmentToShow = (FragmentLifecycle)pageAdapter.getItem(newPosition);
fragmentToShow.onResumeFragment();
FragmentLifecycle fragmentToHide = (FragmentLifecycle)pageAdapter.getItem(currentPosition);
fragmentToHide.onPauseFragment();
currentPosition = newPosition;
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) { }
public void onPageScrollStateChanged(int arg0) { }
};
@Override
public void onDetach()
{
super.onDetach();
try {
Field childFragmentManager =
Fragment.class.getDeclaredField("mChildFragmentManager");
childFragmentManager.setAccessible(true);
childFragmentManager.set(this, null);
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
EDIT:
Вот фрагменты ViewPger (Fragment_X
а также FragmentY
), который я пытаюсь выбрать элементы списка, собрать в массив Strin и опубликовать с пакетом для просмотра в Fragment_Y
,
1 ответ
Вы можете использовать шину событий, чтобы сделать это.
Fragment_Y регистрируется на событие, а Fragment_X публикует это событие. Fragment_Y затем уведомляется об изменениях.
Пример библиотеки: