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
}
}
同样在 Fragment 的 onAttach(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);
}
我想通过 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
}
}
同样在 Fragment 的 onAttach(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);
}