我有这样的应用程序
在FragmentB
我有TextView
和一个Button
。
按钮的功能是将FragmentB
替换为新的片段(FragmentB1
)。在FragmentB1
中,我显示了ListView
Strings
。
在listView' onItemClickListener
中,我必须返回String
并将其放在FragmentB' s TextView
上。问题是我无法使用Fragment.startActivityForResult()
因为我只有一个Activity
(它管理屏幕右侧的交易并显示FragmentA
)。是否可以从这个独特的onActivityResult
调用FragmentB&#39 {s} {/ 1}}?
注意:我无法在Activity
课程上撰写setText(String text)
方法,因为我可能会FragmentB
或FragmentC
代替FragmentD
}
答案 0 :(得分:0)
处理片段时,片段之间的最佳通信方式是通过活动。例如。让我们考虑具有片段B,C和D的活动A. 将新片段设置为通过FragmentManager放置并加载后,可以调用它上面的getActivity()来获取对它的引用。一个好主意是实现一个接口,以便您可以在任何实现它的活动上使用它并调用回调方法:
// creating the fragment here from the mainActivity
FragB fragB = new FragB();
getSupportFragmentManager().beginTransaction()
.replace(R.id.imager, fragB).commit();
// This is because my example activity implements FragBListener which is defined in the FragB class
@Override
public void onCallFromFragB() {
}
FragB
public class FragB extends Fragment {
private FragBListener activity;
....
public interface FragBListener{
void onCallFromFragB();
}
}
现在,您可以通过在onAttach()
上调用getActivity来引用父活动public void onAttach(Context context) {
super.onAttach(context);
....
activity = (FragBListener) getActivity();
}
现在您有对活动的引用,您可以从界面调用实现的方法。你可以真正从父活动中调用任何公共方法,只要你不将它转发给监听器,我只是喜欢它。
现在从活动中调用Fragment内部的方法更加容易。像这样:
FragB fragB= (FragB) getSupportFragmentManager().findFragmentById(R.id.imager);
if(fragB != null){
// FragB is in view
// call it's methods
}
这样,您的片段将是自包含的,并且通过活动完成通信,因此您不必担心该场景。您只是想确保在片段上调用公共方法,只要它们不为null(在布局中)。
供参考,您可以看到this.
好的,到目前为止我所提到的一切,这是你能做的。
如果您不想搞乱界面,您也可以只是对活动进行类型转换。例如,如果活动是MainActivity,
((MainActivity) getActivity()).[any public method]
从其中一个片段调用时也可以。