我有两个片段,A和B让我们说,其中B包含一个列表。我想在片段B上添加一个监听器来通知所选列表项的片段A.我无法弄清楚如何在Fragment B中初始化监听器,因为在fragment的构造函数中传递参数是不好的做法。
注意:片段B包含在片段A中。即我在片段A中有一个FrameLayout;和片段B涵盖了FrameLayout。
知道我该怎么做吗?
答案 0 :(得分:5)
如果你说片段B是片段A的子片段(也就是说,你已经使用片段A getChildFragmentManager()
将它添加到片段A中),那么你可以使用与Activity
接口相同的方法,但使用getParentFragment()
代替getActivity()
。
例如:
片段B:
@Override
public void onAttach(Context context) {
MyInterface myInterface = (MyInterface) getParentFragment();
}
假设片段A实现了MyInterface
。
我们曾经使用过一种方便的方法来避免知道Fragment是由另一个片段还是一个Activity托管,如下所示:
public static <T> getInterface(Class<T> interfaceClass, Fragment thisFragment) {
final Fragment parent = thisFragment.getParentFragment();
if (parent != null && interfaceClass.isAssignableFrom(parent)) {
return interfaceClass.cast(parent);
}
final Activity activity = thisFragment.getActivity();
if (activity != null && interfaceClass.isAssignableFrom(activity)) {
return interfaceClass.cast(activity);
}
return null;
}
然后你可以使用:
MyInterface myInterface = getInterface(MyInterface.class, this);
并且片段B是作为子片段托管还是直接托管在活动中并不重要。
答案 1 :(得分:4)
对于这种情况更好的方法,因为你想要做的是片段之间的通信,就是使用一个接口。您想在B更改时通知A.这应该通过父活动来完成。以下是关于该主题的Android文档:https://developer.android.com/training/basics/fragments/communicating.html。
它的要点是你想用一个名为OnItemSelected的方法定义一个接口(你可以随意命名它)。在B中,您需要引用此接口。选择项目后,调用新的OnItemSelected方法。在两个片段的父活动中实现此接口。在实现中,您可以放置要修改的任何代码A.
一个例子
<强> CommunicationInterface 强>
public interface CommunicationInterface {
public void onItemSelected(int position);
}
<强> FragmentB 强>
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
CommunicationInterface myInterface = (CommunicationInterface) getActivity();
// What ever else you want here
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
// Send the event to the host activity
myInterface.onItemSelected(position);
}
<强> MainActivity 强>
public class MainActivity extends FragmentActivity implements CommunicationInterface {
// What ever other code you have
@Override
public void onItemSelected(int position) {
FragmentA fragA = (FragmentA)
getSupportFragmentManager().findFragmentById(R.id.fragment_a);
// Code to interact with Fragment A
}
答案 2 :(得分:0)
签出合约模式https://gist.github.com/JakeWharton/2621173
如果您使用多个片段,则不必为每个片段执行此操作,只需将其添加到BaseActivity中即可。
此示例显示活动和片段之间的通信。但是对于嵌套片段,您可以使用getParentFragment();
替换acitivy