Android:在父级和子级片段之间传递更新数据

时间:2016-03-17 12:55:50

标签: java android android-fragments android-data-usage

如何将数据从“父级”Fragment传递到“子级”Fragment?我已经看过如何在片段之间传递数据,但在我的情况下,我无法使用Activity

在我的应用程序中,我有一个Activity,点击Fragment的{​​{1}}即可创建ListitemActivity创建一个类,Fragment从Data-Creating-Class获取持久数据,该数据由循环创建。创建Fragment后,它会创建多个子片段,每个都有不同的视图,应显示更新的数据。

但我的问题是,我无法将数据从Fragment传递到Parentfragment。我不确定它是一个传递问题还是Childfragment的创建问题。

在我的情况下,“textValueView”和“mySeries”始终为null。为什么?

父母片段

Childfragment

CHILDFRAGMENT

public class ScreenSlidePagerActivity extends Fragment {


    Bundle bundle = new Bundle();

    public boolean stop = false;

    private ServerFragment newServer;

   //Pager Widget for animation handeling
    private ViewPager mPager;

   //Pager Adapter provides the pages to view pager widget
    private PagerAdapter mPagerAdapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                        Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


        ViewGroup sliderFragmentView = (ViewGroup)   inflater.inflate(R.layout.fragment_screen_slide, container, false);

        ConnectAndReadTask myTask = new ConnectAndReadTask(ScreenSlidePagerActivity.this , "opc.tcp://10.0.2.2:52520" +
            " - " + "mySinus", new NodeId(Integer.parseInt("2"), "mySinus"));
        myTask.execute(new String[]{"opc.tcp://10.0.2.2:52520"});


        // Initiate a ViewPager and a PagerAdapter
        mPager = (ViewPager) sliderFragmentView.findViewById(R.id.pager);
        mPagerAdapter = new ScreenSlidePagerAdapter(getFragmentManager());
        mPager.setAdapter(mPagerAdapter);

        return sliderFragmentView;

}

private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {

    public ScreenSlidePagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch(position){
            case 0:
                return newServer.newInstance("url","url","url");
            case 1:
                return new GaugeFragment();
            case 2:
                return new GaugeFragment();
            default:
                return new GaugeFragment();
        }

    }

    @Override
    public int getCount() {
        return 3;
    }
}

@Override
public void onDestroy() {
    stop = true;
    super.onDestroy();
}

/**
 *
 * @param value
 */

public void setData(String value)
{

    Log.d("ScreenSlide.SetData", value);
   // mCallback.onValueSelected(value);#
  bundle.putString("value", value);
    ServerFragment.create(value);
    newServer.setArguments(bundle);
   //newServer.setData(value);

}


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    newServer = new ServerFragment();
}
}

2 个答案:

答案 0 :(得分:0)

通常的方法是将它从1st Fragment传递给host Activity,它会将它发送到2nd Fragment。

我不知道为什么你不能这样做但是如果它真的像你说你可以尝试使用Jake Warton的Otto Bus库并且只是将你的片段订阅到公共汽车。

class Fragment1 { 

  @Override
    public void onResume() {
        super.onResume();
        mBus.register(this);
    }

    @Override
    public void onPause() {
        mBus.unregister(this);
        super.onPause();
    }

    //let's assume you need to do it it on button click
    @Override
    public void onClick(View v) {
      mBus.post(new SomeDataEvent())
    }
} 
//======================

class Fragment2 { 

  @Override
    public void onResume() {
        super.onResume();
        mBus.register(this);
    }

    @Override
    public void onPause() {
        mBus.unregister(this);
        super.onPause();
    }

    //here we define method to handle your data
    @Subscribe
    public void onSomeData(SomeDataEvent object) {
      //do something with it
    }
} 

在此处查看更多信息http://square.github.io/otto/

答案 1 :(得分:0)

您可以使用所需的数据作为参数向片段添加公共方法。然后,您可以从父片段调用此方法。您需要做的就是获取您创建的片段的引用。

您可以使用mPagerAdapter.getItem(int position);

遍历片段

您还可以在创建片段时为片段添加标识符,以便您可以更轻松地区分它们。例如,您可以new GaugeFragment()代替new GaugeFragment(identifierString)。现在每个片段都可以告诉您有关"谁"它是。您也可以使用不同类型的片段。

    PagerAdapter mPagerAdapter;
    ScreenSlidePagerAdapter screenSlidePagerAdapter;

    screenSlidePagerAdapter =  new ScreenSlidePagerAdapter(getFragmentManager());
    mPagerAdapter = screenSlidePagerAdapter;

以及稍后要设置数据时:

    int count = screenSlidePagerAdapter .getCount();
    for(int i=0;i<count;i++){
        Fragment fragment = screenSlidePagerAdapter .getItem(i);
        if(fragment instanceof GaugeFragment){
            ((GaugeFrament)fragment).gaugeFragmentMethod(data);
            break;
        }
        else if(fragment instanceof OtherTypeOfFragment){
            ((OtherTypeOfFragment)fragment).otherTypeOfFragmentMethod(data);
            break;
        }
    }