两个片段之间的接口通信

时间:2019-03-13 21:34:20

标签: java android android-fragments

我已经实现了主从视图。在10英寸大屏幕上并排显示两个片段。 片段A 显示订单列表。选择订单后,该订单的详细信息将显示在片段B 中。在片段B中处理了订单项之后。我想通知片段A 更新用户界面并为订单列表中的已处理订单着色。

我尝试过的当前方法是在片段B 中创建一个接口,并在片段A 中实现该接口。但是,该方法似乎不起作用,因为当我尝试在onAttach方法中设置接口的实例时,应用程序崩溃了,因为上下文仍然是 Fragment A 的上下文。

@Override
public void onAttach(@NonNull Context context)
{
    super.onAttach(context);

    if (context instanceof OnStockAddedListener)
    {
        onStockAddedListener = (OnStockAddedListener) this.getActivity();

    } else
    {
        throw new ClassCastException(context.toString());
    }
}

我该怎么做。

1 个答案:

答案 0 :(得分:4)

您的片段托管在Activity中,而该活动就是传递给onAttach()的内容。因此,您的活动需要负责在片段之间调度通信。

因此,在FragmentB中,在连接后将Activity投射到侦听器界面:

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    this.onStockAddedListener = (OnStockAddedListener) context;
}

然后在“活动”中实现该接口:

public class MyActivity implements OnStockAddedListener {

    @Override
    public void onStockAdded(Stock stock) {
        FragmentA fragmentA = (FragmentA) getSupportFragmentManager()
                .findFragmentByTag(/* insert tag here */);

        fragmentA.handleStockAdded(stock);
    }
}

您会在FragmentA中收到以下消息:

public class FragmentA {

    public void handleStockAdded(Stock stock) {
        // update ui, or whatever else you need
    }
}

主要是不要考虑FragmentA与FragmentB对话,或者FragmentB与FragmentA对话。相反,FragmentA和FragmentB都与Activity对话,并且Activity可以(根据需要)与FragmentA或FragmentB对话。一切都流经活动。