在两个片段

时间:2016-08-25 22:24:34

标签: android android-fragments android-recyclerview listeners

我有两个片段,A和B让我们说,其中B包含一个列表。我想在片段B上添加一个监听器来通知所选列表项的片段A.我无法弄清楚如何在Fragment B中初始化监听器,因为在fragment的构造函数中传递参数是不好的做法。

注意:片段B包含在片段A中。即我在片段A中有一个FrameLayout;和片段B涵盖了FrameLayout。

知道我该怎么做吗?

3 个答案:

答案 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