1

有一个 Activity 具有片段及其子片段。需要在两个子片段之间交换动态生成的字符串数组。但是,无论我为此使用了什么技术,它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);
    }
   ...
 }

当 ViewPager 项目位置更改时,Fragment_Y 应该接收捆绑消息

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:片段_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 Fragments (Fragment_XFragmentY),我尝试选择列表项,收集到 Strin 数组中并与捆绑包一起发布以在Fragment_Y.

在此处输入图像描述

4

1 回答 1

1

您可以使用事件总线来做到这一点。

Fragment_Y 注册到一个事件,而 Fragment_X 发布该事件。然后将更改通知 Fragment_Y。

图书馆的例子:

于 2014-05-22T13:50:06.183 回答