1

フラグメントとその子フラグメントを持つアクティビティがあります。動的に生成された文字列配列は、2 つの子フラグメント間で交換する必要があります。しかし、私がそのためにどんなテクニックを使ったとしても、それはnull 毎回戻ってきました.

私の設計では面倒ですが、カスタム インターフェイスの実装も使用しました。この問題の解決策を提案していただければ幸いです。

ここに画像の説明を入力

Fragment-X と Fragment-Y は ViewPager Adapter で定義され、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 Fragments ( Fragment_Xand FragmentY) があります。これは、リスト アイテムを選択し、Strin 配列に収集し、バンドルで公開して で表示しようとしていますFragment_Y

ここに画像の説明を入力

4

1 に答える 1

1

これを行うには、イベント バスを使用できます。

Fragment_Y はイベントに登録し、Fragment_X はそのイベントを発行します。その後 Fragment_Y に変更が通知されます。

ライブラリの例:

于 2014-05-22T13:50:06.183 に答える