Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:在父片段和子片段之间传递更新数据_Java_Android_Android Fragments_Android Data Usage - Fatal编程技术网

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

Java Android:在父片段和子片段之间传递更新数据,java,android,android-fragments,android-data-usage,Java,Android,Android Fragments,Android Data Usage,如何将数据从“父”片段传递到“子”片段?。我已经研究了如何在片段之间传递数据,但是在我的例子中,我不能使用活动 在我的应用程序中,我有一个活动,它通过单击活动的列表项来创建一个片段。片段创建一个类,片段从数据创建类获取持久数据,该类由循环创建。创建片段后,它会创建几个子片段,每个子片段都有不同的视图,这些视图应显示更新的数据 但我的问题是,我无法将数据从Parentfragment传递到Childfragment。我不确定这是传递问题还是创建Childfragment的问题 在我的例子中,“te

如何将数据从“父”片段传递到“子”片段?。我已经研究了如何在片段之间传递数据,但是在我的例子中,我不能使用
活动

在我的应用程序中,我有一个
活动
,它通过单击
活动
列表项
来创建一个
片段
片段
创建一个类,
片段
从数据创建类获取持久数据,该类由循环创建。创建
片段
后,它会创建几个子片段,每个子片段都有不同的视图,这些视图应显示更新的数据

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

在我的例子中,“textValueView”和“mySeries”总是空的。为什么?

父片段

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();
}
}
public class ServerFragment extends Fragment {

TextView urlTextView, nodeTextView, valueTextView;

public static String passValue;
//Graph
GraphView graphView;
public LineGraphSeries<DataPoint>mySeries;
private double graph2LastXValue = 5d;


public View myFragmentView;
public String url, namespace, nodeName;

public ServerFragment() {}


@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

   myFragmentView  = inflater.inflate(R.layout.fragment_server, container, false);

    urlTextView = (TextView)myFragmentView.findViewById(R.id.urlTextView);
    nodeTextView = (TextView)myFragmentView.findViewById(R.id.nodeTextView);
    valueTextView = (TextView)myFragmentView.findViewById(R.id.valueTextView);



    //Graph
    graphView = (GraphView)myFragmentView.findViewById(R.id.graphView);
    mySeries = new LineGraphSeries<DataPoint>();

    mySeries.setColor(Color.RED);

    graphView.addSeries(mySeries);
    graphView.getViewport().setXAxisBoundsManual(true);
    graphView.getViewport().setMinX(0);
    graphView.getViewport().setMaxX(100);
    graphView.getViewport().setMinY(-20);
    graphView.getViewport().setMaxY(70);

    url = getArguments().getString("url");

    urlTextView.setText(getArguments().getString("url"));
    nodeTextView.setText(getArguments().getString("ns") + " | " + getArguments().getString("nodeName"));

    return myFragmentView;

}



public void setData() {


    Bundle bundle = this.getArguments();

    String value = bundle.getString("value");
    graph2LastXValue += 1d;
    try {
        mySeries.appendData(new DataPoint(graph2LastXValue, Double.parseDouble(value)),
                true, 200);
    }
    catch (Exception e)
    {
        Log.d("mySeries.appendData", e.getMessage());
    }

    try {
        valueTextView.setText(value);
    }

    catch (Exception e)
    {
        Log.d("valueTextView", e.getMessage());
    }




    Log.d("Serverfragment setData:" , value);
}



@Override
public void onStart() {
    super.onStart();

        setData();

}


@Override
public void onDestroy() {

    Log.d("ServerFragment", "disconnected");
    super.onDestroy();
}


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

}


public static ServerFragment newInstance(String url, String ns, String nodeName) {

    ServerFragment sf = new ServerFragment();
    Bundle b = new Bundle();
    b.putString("url", url);
    b.putString("ns", ns);
    b.putString("nodeName", nodeName);



    sf.setArguments(b);

    return sf;
}

}
子片段

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();
}
}
public class ServerFragment extends Fragment {

TextView urlTextView, nodeTextView, valueTextView;

public static String passValue;
//Graph
GraphView graphView;
public LineGraphSeries<DataPoint>mySeries;
private double graph2LastXValue = 5d;


public View myFragmentView;
public String url, namespace, nodeName;

public ServerFragment() {}


@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

   myFragmentView  = inflater.inflate(R.layout.fragment_server, container, false);

    urlTextView = (TextView)myFragmentView.findViewById(R.id.urlTextView);
    nodeTextView = (TextView)myFragmentView.findViewById(R.id.nodeTextView);
    valueTextView = (TextView)myFragmentView.findViewById(R.id.valueTextView);



    //Graph
    graphView = (GraphView)myFragmentView.findViewById(R.id.graphView);
    mySeries = new LineGraphSeries<DataPoint>();

    mySeries.setColor(Color.RED);

    graphView.addSeries(mySeries);
    graphView.getViewport().setXAxisBoundsManual(true);
    graphView.getViewport().setMinX(0);
    graphView.getViewport().setMaxX(100);
    graphView.getViewport().setMinY(-20);
    graphView.getViewport().setMaxY(70);

    url = getArguments().getString("url");

    urlTextView.setText(getArguments().getString("url"));
    nodeTextView.setText(getArguments().getString("ns") + " | " + getArguments().getString("nodeName"));

    return myFragmentView;

}



public void setData() {


    Bundle bundle = this.getArguments();

    String value = bundle.getString("value");
    graph2LastXValue += 1d;
    try {
        mySeries.appendData(new DataPoint(graph2LastXValue, Double.parseDouble(value)),
                true, 200);
    }
    catch (Exception e)
    {
        Log.d("mySeries.appendData", e.getMessage());
    }

    try {
        valueTextView.setText(value);
    }

    catch (Exception e)
    {
        Log.d("valueTextView", e.getMessage());
    }




    Log.d("Serverfragment setData:" , value);
}



@Override
public void onStart() {
    super.onStart();

        setData();

}


@Override
public void onDestroy() {

    Log.d("ServerFragment", "disconnected");
    super.onDestroy();
}


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

}


public static ServerFragment newInstance(String url, String ns, String nodeName) {

    ServerFragment sf = new ServerFragment();
    Bundle b = new Bundle();
    b.putString("url", url);
    b.putString("ns", ns);
    b.putString("nodeName", nodeName);



    sf.setArguments(b);

    return sf;
}

}
public类ServerFragment扩展了Fragment{
TextView URL TextView、nodeTextView、valueTextView;
公共静态字符串passValue;
//图表
GraphView GraphView;
公共线路图经验系列;
专用双图2LASTXVALUE=5d;
公共视图myFragmentView;
公共字符串url、命名空间、节点名;
公共服务器片段(){}
@可空
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
myFragmentView=充气机。充气(R.layout.fragment\u服务器,容器,false);
urlTextView=(TextView)myFragmentView.findViewById(R.id.urlTextView);
nodeTextView=(TextView)myFragmentView.findViewById(R.id.nodeTextView);
valueTextView=(TextView)myFragmentView.findViewById(R.id.valueTextView);
//图表
graphView=(graphView)myFragmentView.findViewById(R.id.graphView);
mySeries=newlinegraphseries();
setColor(Color.RED);
graphView.addSeries(mySeries);
graphView.getViewport().setXAxisBoundsManual(true);
graphView.getViewport().setMinX(0);
graphView.getViewport().setMaxX(100);
graphView.getViewport().setMinY(-20);
graphView.getViewport().setMaxY(70);
url=getArguments().getString(“url”);
urlTextView.setText(getArguments().getString(“url”);
nodeTextView.setText(getArguments().getString(“ns”)+“|”+getArguments().getString(“nodeName”));
返回myFragmentView;
}
public void setData(){
Bundle=this.getArguments();
字符串值=bundle.getString(“值”);
图2 LastX值+=1d;
试一试{
appendData(新数据点(graph2LastXValue,Double.parseDouble(value)),
对,200);
}
捕获(例外e)
{
Log.d(“mySeries.appendData”,e.getMessage());
}
试一试{
valueTextView.setText(值);
}
捕获(例外e)
{
Log.d(“valueTextView”,e.getMessage());
}
Log.d(“Serverfragment setData:”,值);
}
@凌驾
public void onStart(){
super.onStart();
setData();
}
@凌驾
公共空间{
Log.d(“ServerFragment”,“disconnected”);
super.ondestory();
}
@凌驾
创建时的公共void(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
}
公共静态ServerFragment newInstance(字符串url、字符串ns、字符串节点名){
ServerFragment sf=新的ServerFragment();
Bundle b=新Bundle();
b、 putString(“url”,url);
b、 putString(“ns”,ns);
b、 putString(“nodeName”,nodeName);
sf.setArguments(b);
返回sf;
}
}

通常的方法是将它从第一个片段传递到宿主活动,然后将它分派到第二个片段

我不知道为什么你们不能这么做,但若真的像你们说的那个样,你们可以试着使用杰克·沃顿的奥托巴士图书馆,把你们的两个片段都订阅到巴士上

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
    }
} 

请参阅此处的更多信息

通常的方法是将其从第一个片段传递到宿主活动,然后将其分派到第二个片段

我不知道为什么你们不能这么做,但若真的像你们说的那个样,你们可以试着使用杰克·沃顿的奥托巴士图书馆,把你们的两个片段都订阅到巴士上

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
    }
} 

请参阅此处的更多信息

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

可以使用mPagerAdapter.getItem(int位置)循环遍历片段

您还可以在创建片段时将标识符添加到片段中,以便更容易区分它们。例如,您可以执行
new gaugeefragment(identifierString)
,而不是
new gaugeefragment()
。现在每个片段都可以告诉你关于“谁”的信息。也可以有不同类型的片段

    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;
        }
    }
int count=screenSlidePagerAdapter.getCount();

对于(int i=0;i,您可以将一个公共方法添加到片段中,并将所需的数据作为参数。然后您可以从父片段调用此方法。您所需要做的就是获取所创建片段的引用

可以使用mPagerAdapter.getItem(int位置)循环遍历片段

您还可以在创建片段时将标识符添加到片段中,以便更容易地对其进行区分。例如,您可以执行
new-gaugeeragment()
而不是
new-gaugeeragment(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;
        }
    }
int count=screenSlidePagerAdapter.getCount();

for(int i=0;i在两个片段之间设置接口,并将数据从一个片段传递到另一个片段