2017-02-13 51 views
0

我创建了一个接口,当我按FragmentA上的TextView时,我可以在FragmentB上设置文本。有些东西不起作用,我无法弄清楚这一点。创建一个接口与另一个片段进行通信

我创建了一个接口来调用通讯:

public interface Communicator { 
void respond(String data); 

}

在FragmentA我已经设置TextView的接口上引用名为Communcator和OnClickListener:

Communicator comm; 

homeTextView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      comm.respond("Trying to set text on FragmentB from here"); 
     } 
    }); 

FragmentB,设置我的方法来改变文字:

public void setText(final String data) { 
    startTripTxt.setText(data); 
} 

终于在MainActivity我已经实现了接口。我觉得这里是我做错了什么:

@Override 
public void respond(String data) { 

    getSupportFragmentManager().beginTransaction() 
      .replace(R.id.container_main, new FragmentB(), "fragment2").addToBackStack(null).commit(); 

    FragmentB fragmentB= (FragmentB) getSupportFragmentManager().findFragmentByTag("fragment2"); 
    if (fragmentB != null) { 
     fragmentB.setText(data); 
    } 


} 

片段2个负荷,但文字是空的。

+0

好。我认为这个问题是在MainActivity的响应函数中当你调用'commit()'时,它并没有在UI线程中运行,需要一段时间才能完成它,然后在之后声明的fragmentB将为空。 – TruongHieu

回答

2

碎片2加载,但文本为空。

你实现了Communicator是可以的,但是你调用FragmentB并传递数据的方式并不正确。这就是你无法从FragmentB获得文本的原因。将数据发送到FragmentB的正确方法应该是这样的:

public static FragmentB createInstance(String data) { 
     FragmentB fragment = new FragmentB(); 
     Bundle bundle = new Bundle(); 
     bundle.putString("data", data); 
     fragment.setArguments(bundle); 
     return fragment; 
    } 

而且你可以从FragmentB通过得到的数据:

Bundle bundle = getArguments(); 
     if (bundle != null) { 
      String data = bundle.getString("data"); 
     } 
1

它看起来像你声明fragmentB后,你的意思设置该片段上的文本。你正在调用trainFinderFragment.setText()。这是你的问题吗?

FragmentB fragmentB= (FragmentB) getSupportFragmentManager().findFragmentByTag("fragment2"); 
if (fragmentB != null) { 
    fragmentB.setText(data); 
} 
+0

我编辑了我的问题。 FragmentB实际上被称为TrainFinderFragment,但在此处将其重命名为FragmentB,因此每个人都更清楚。 – r3dm4n

+0

噢好吧。是的,给你的编辑,你应该采取RoShan的建议。通过一个包传递文本。 –