Android 如何在 volley 请求成功后将数据从 Activity 传递到 Fragment?

Android How to pass data from Activity to Fragment once successful volley request?

我想通过 BroadcastReceiver 将数据从 activity 传递到片段。但是我无法获取片段中的数据,因为 onReceive() 没有启动。

在我的 AppConfig 中:

public static final String CREATE_POST = "created_post";

在activity中实现所有这些东西:

 StringRequest request = new StringRequest(Request.Method.POST, AppConfig.MYURL, new Response.Listener<String>(){
            @Override
            public void onResponse(String response) {

    Intent intent = new Intent(AppConfig.CREATE_POST);
    intent.putExtra("myId",myId);
    intent.putExtra("userId",userId);
    intent.putExtra("username",username);

    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}

在应该接收数据的片段中我已经实现了这个:

private BroadcastReceiver broadcasterReceiver;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

//..other code here

    broadcasterReceiver = new BroadcastReceiver() {
       @Override
       public void onReceive(Context context, Intent intent) {
          if(intent.getAction().equals(AppConfig.CREATE_POST)){
             Log.d("Broadcast","get called")
             //HERE I get the intent here
          }
       }

 }


//I already register the boardcast in onResume() and onPause()
@Override
    public void onResume() {
        super.onResume();
        //register the broadcaster
        LocalBroadcastManager.getInstance(getActivity()).registerReceiver(broadcasterReceiver,
                new IntentFilter(AppConfig.CREATE_POST));
    }

  @Override
  public void onPause() {
    super.onPause();
   //unregister the broadcaster
        LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(broadcasterReceiver);
    }

我还错过了什么?为了使这项工作。

使用此代码,这是我这边的工作:

private BroadcastReceiver broadcasterReceiver;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

//..other code here

    broadcasterReceiver = new BroadcastReceiver() {
       @Override
       public void onReceive(Context context, Intent intent) {
          if(intent.getAction().equals(AppConfig.CREATE_POST)){
             Log.d("Broadcast","get called")
             //HERE I get the intent here
          }
       }

 }


//I already register the boardcast in onResume() and onPause()
@Override
    public void onResume() {
        super.onResume();
        //register the broadcaster
        LocalBroadcastManager.getInstance(getActivity()).registerReceiver(broadcasterReceiver,
                new IntentFilter(AppConfig.CREATE_POST));
    }

  @Override
  public void onPause() {
    super.onPause();
   //unregister the broadcaster
        LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(broadcasterReceiver);
    }

使用此代码注册广播

首先,在包的任意位置创建一个 interface。例如 -

public interface SyncDataListener {
    void refreshDashboard(String myId, String username, String userId);
}

然后在您的 Activity 中创建一个全局声明和 setter/resetter 方法,例如 -

private SyncDataListener syncDataListener;

public void setSyncDataListener(SyncDataListener syncDataListener) {
    this.syncDataListener = syncDataListener;
}

public void resetSyncDataListener(){
    syncDataListener = null;
}

接下来在你的 Fragment 中实现上面的 interface 并覆盖像 -

这样的方法
public class DashboardFragment extends Fragment implements SyncDataListener {  
    @Override
    public void refreshDashboard(String myId, String username, String userId) {
        //Your code that deals with the data received from activity
    }
}

同样在 FragmentonAttach(Context context) 方法中调用在 activity 中创建的 setter 方法,例如 -

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    ((MainActivity) getActivity()).setSyncDataListener(this);
}

还要确保在 Fragment 像 -

一样被销毁时重置侦听器实例
@Override
public void onDestroyView() {
    super.onDestroyView();
    ((MainActivity) getActivity()).resetSyncDataListener();
}

现在只要你需要从 Activity 发送数据到 Fragment 你可以调用 -

if (syncDataListener != null) {
    syncDataListener.refreshDashboard(myId, username, userId);
}