使用 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();
- 在片段 B 中定义接口
要允许 Fragment 与其 Activity 通信,您可以在 Fragment class 中定义一个接口并在 Activity 中实现它。片段在其 onAttach() lifecycle
方法期间捕获接口实现,然后可以调用接口方法以便与 Activity.
通信
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);
}
}
}
我在使用 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();
- 在片段 B 中定义接口
要允许 Fragment 与其 Activity 通信,您可以在 Fragment class 中定义一个接口并在 Activity 中实现它。片段在其
onAttach() lifecycle
方法期间捕获接口实现,然后可以调用接口方法以便与 Activity. 通信
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);
}
}
}