Динамический обмен данными между дочерними фрагментами

Существует действие, которое имеет фрагменты и их дочерние фрагменты. Динамически создаваемый массив строк необходимо обменивать между двумя дочерними фрагментами. Но, что бы я ни использовал для этого, оно вернулось 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 затем уведомляется об изменениях.

Пример библиотеки:

Другие вопросы по тегам