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

Fragment to Fragment communication fails using LocalBroadcastManager

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

FragmentA 有 editText,单击它会启动 FragmentB。 FragmentB 有一个项目列表和 onclick 我想将数据传递给 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 消息。有什么遗漏吗? 感谢任何建议。

如果 "launch" 意味着您将 Fragment A 替换为 Fragment B,那么您就错了..

您应该将 Fragment B 添加到 backstack

FragmentTransaction#addToBackStack(String fragmentName);

你应该做

FragmentTransaction#add()

而不是

FragmentTransaction#replace()

Add: 将添加另一个 Fragment View 到容器

Replace: 将一个容器的所有内容替换为另一个 Fragment

我确定您正在用 Fragment B 替换 Fragment A,在这种情况下,您的 Fragment A 将被销毁并且 Fragment B 将被加载,您将无法在 Fragment A

中继续收听更新

正如 J Ramesh 所建议的那样,通过将片段交易类型从 replace 更改为 add,解决了该问题。

这是片段交易。

    FragmentManager fm = getFragmentManager();
    FragmentTransaction transaction = fm.beginTransaction();
    transaction.add(android.R.id.content, new FragmentA())
            .addToBackStack(null).commit();
  1. 在片段 B 中定义接口

    要允许 Fragment 与其 Activity 通信,您可以在 Fragment class 中定义一个接口并在 Activity 中实现它。片段在其 onAttach() lifecycle 方法期间捕获接口实现,然后可以调用接口方法以便与 Activity.

  2. 通信

    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]);
    }
});

为了从片段接收​​事件回调,承载它的 activity 必须实现片段 class 中定义的接口。

 public static class MainActivity extends Activity
            implements FragmentB.UpdateFragmentA{
        ...

        public void update_fragment(String data) {
            // The user selected the Item 

            // send that data to fragment A
            a.recieve(data);  //a is FragmentA reference a=new FragmentA();
        }
    }

主机activity可以通过捕获Fragment实例向Fragment投递消息

在FragmentA中定义方法recieve(String s);

   public class FragmentA extends Fragment {
   ....
   ...
   
   public void recieve(String s)
    {
      //You get Selected Item From FragmentB through Activity
            // Do something here to display that

        if(!s.isEmpty())
        {
          textview.setText(s);
        }

    }
    
 }