当前位置: 首页 > 知识库问答 >
问题:

使用LocalBroadcastManager时片段到片段的通信失败

朱阳晖
2023-03-14

我在使用LocalbroadcastManager将数据从一个片段传输到另一个片段时遇到问题。

FragmentA有editText,点击它将启动FragmentB。FragmentB有一个项目列表,单击我想将数据传递给FragmentA的每个项目。

这是我的实现。

public class FragmentA extends Fragment {
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String highSchoolName = intent.getStringExtra("HighSchoolName");
    }
};

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    LocalBroadcastManager.getInstance(getContext()).registerReceiver(mMessageReceiver, new IntentFilter("HighSchoolEvent"));
}

@Override
public void onDestroyView() {
    super.onDestroyView();
    LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(mMessageReceiver);
}

下面是广播消息发送的片段B。

public class FragmentB extends Fragment {

    mHighSchoolListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            HighSchool highSchoolItem = mHighSchoolAdapter.getItem(position);
            sendHighSchoolItemToSignupForm(highSchoolItem);
        }
    });

    private void sendHighSchoolItemToSignupForm(HighSchool highSchoolItem) {
        Intent intent = new Intent("HighSchoolEvent");
        intent.putExtra("HighSchoolName", highSchoolItem.getName());
        LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent);
        getActivity().onBackPressed();
    }
}

调试/日志记录从未命中广播接收器的onReceive消息。少了什么吗?谢谢你的建议。

共有3个答案

慕容典
2023-03-14
  1. 在片段B

    中定义接口为了允许片段与其活动进行通信,可以在片段类中定义接口并在活动中实现它。片段在其onAttach()生命周期方法中捕获接口实现,然后可以调用接口方法以与活动通信

    UpdateFragmentA update;
    public interface  UpdateFragmentA {
       
        public void update_fragment(String data);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            update= (UpdateFragmentA ) getActivity();
        }catch (Exception e)
        {
            e.printStackTrace();
        }


    }



// set setOnItemClickListener for List View
listview.setOnItemClickListener(new OnItemClickListener()
{
    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1,int position, long arg3)
    { 
       update.update_fragment(items[position]);
    }
});
孙修德
2023-03-14

正如J Ramesh所建议的,通过将片段事务类型从replace更改为add,解决了这个问题。

下面是片段事务。

    FragmentManager fm = getFragmentManager();
    FragmentTransaction transaction = fm.beginTransaction();
    transaction.add(android.R.id.content, new FragmentA())
            .addToBackStack(null).commit();
高高雅
2023-03-14

如果“launch”表示您将片段A替换为片段B,那么您就错了。。

您应该将片段B添加到backstack

FragmentTransaction#addToBackStack(String fragmentName);

你应该这么做

FragmentTransaction#add()

而不是

FragmentTransaction#替换()

添加:将向容器添加另一个片段视图

替换:将容器中的所有内容替换为另一个片段

我确信你正在用片段B替换片段A,在这种情况下,你的片段A将被销毁,片段B将被加载,你将无法在片段A中收听更新

 类似资料:
  • 我有一个活动和两个片段的包含一个。现在我可以通过实现谷歌的指南回调界面从片段到活动进行通信。但是我如何从活动到片段的另一种方式交流呢?如果活动(外部事件)中发生了什么,我想更新片段。我设法得到了Frag1碎片 但当我在frag上调用公共方法时,我得到了一个IllegalStateException:片段未附加到Activity,可能是因为getItem(0)返回了Frag1的一个新实例,而该实例尚

  • 是否有一种方法可以检查堆栈中的前一个片段是否是包含SupportMap的片段?

  • 我正试图做到这一点:http://android-er.blogspot.com/2012/06/communication-between-fragments-in.html只不过我用的是一台碎纸机 我有一个有两个片段的活动 FragmentA有一个编辑文本和一个按钮,FragmentB有一个文本视图 现在我想要的是,每当我在编辑文本中输入一些内容并单击按钮时,我的文本视图中就会出现一些内容。

  • 我有一个片段和一个对话框片段,我想在它们之间进行通信:将数据从片段发送到对话框片段,并将数据从对话框片段发送到片段 我阅读了有关和的信息,但我不明白如何正确使用它们向/从发送/接收数据。 任何帮助?

  • 问题内容: 需要专家意见,我应该如何构造这个问题。我有一个自定义方法 process_filter ,它驻留在一个片段中,因为它需要访问私有和该片段。 在处理过程中,此片段将访问一个,并且在其中我需要使用back process_filter 方法 基本上,这里是结构: MyFragment.java MyAdapter.java 问题答案: 创建一个从适配器到片段的接口。 在适配器中创建接口,并

  • Hy,我是android开发的新手,我正在尝试在我的自定义对话框片段(扩展了DialogFragment并包含四个按钮)和view Pager中的片段之间建立一个通信。 我的视图分页器适配器扩展了FragmentStatePagerAdapter并包含7个选项卡,但对于每个选项卡,我创建了相同的片段,该片段具有一个recyclerView,但用于列表的数据不同。这个想法是,如果我单击对话框片段中的