Android 替换为相同片段后,不会再次调用OnCreateView

Android 替换为相同片段后,不会再次调用OnCreateView,android,android-fragments,Android,Android Fragments,我正在使用一个下拉菜单,其中包含工具栏中的不同项目。在活动中,我会在单击菜单项后立即添加片段。调用片段OnCreateview,并从API获取数据。所有菜单项的数据提取逻辑保持不变,但只有API端点不同。因此,我尝试使用API端点名称传递包,并对所有项使用相同的片段。但问题是,OnCreateView仅在第一次调用时发出请求,并且仅针对第一个片段事务发出请求,即使我正在为不同的项目单击替换相同的片段 Activity.java public void onItemSelected(Ada

我正在使用一个下拉菜单,其中包含工具栏中的不同项目。在活动中,我会在单击菜单项后立即添加片段。调用片段OnCreateview,并从API获取数据。所有菜单项的数据提取逻辑保持不变,但只有API端点不同。因此,我尝试使用API端点名称传递包,并对所有项使用相同的片段。但问题是,OnCreateView仅在第一次调用时发出请求,并且仅针对第一个片段事务发出请求,即使我正在为不同的项目单击替换相同的片段

Activity.java

    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
    switch (i) {
        case 0: //Clients
            Bundle bundle1 = new Bundle();
            bundle1.putString("hash-key","item1");
            ReportCategoryFragment rp1 = new ReportCategoryFragment();
            rp1.setArguments(bundle1);
            replaceFragment(rp1,false,R.id.container);
            break;

        case 1:
            Bundle bundle2 = new Bundle();
            bundle2.putString("hash-key","item2");
            ReportCategoryFragment rp2 = new ReportCategoryFragment();
            rp2.setArguments(bundle2);
            replaceFragment(rp2,false,R.id.container);
            break;
      }
     }
replaceFragment函数

     public void replaceFragment(Fragment fragment, boolean addToBackStack, int containerId) {
    invalidateOptionsMenu();
    String backStateName = fragment.getClass().getName();
    boolean fragmentPopped = getSupportFragmentManager().popBackStackImmediate(backStateName,
            0);

    if (!fragmentPopped && getSupportFragmentManager().findFragmentByTag(backStateName) ==
            null) {
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(containerId, fragment, backStateName);
        if (addToBackStack) {
            transaction.addToBackStack(backStateName);
        }
        transaction.commit();
    }
}
编辑:FragmentnewInstance方法

     public static ReportCategoryFragment newInstance() {
    ReportCategoryFragment fragment = new ReportCategoryFragment();
    Bundle bundle = new Bundle();
    fragment.setArguments(bundle);
    return fragment;
}

尝试在片段中使用静态方法来创建片段的新实例

public static Fragment newInstance() 
{
    MyFragment myFragment = new MyFragment();
    return myFragment;
}

简单的解决方案是使用
广播接收器
在你的
片段中声明这个

BroadcastReceiver broadCastNewMessage = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
           //extract our message from intent
            String msg_for_me = intent.getStringExtra("some_msg");

        }
    };
现在在片段的
onCreate()
中注册此

registerReceiver(this.broadCastNewMessage, new IntentFilter("update_fragment"));
onDestroyView()中

现在,从服务类调用此方法,您要在其中从菜单选择更新活动

Intent intent = new Intent("update_fragment");
intent.putExtra("some_msg", message); 
sendBroadcast(intent);

使用单例片段并在其constructor@quicklearner在公认的答案中提到“片段是应用程序的可重用组件,不应该将它们作为单例使用”。还有其他可能的解决方案吗?我想如果你想使用相同的片段,你可以使用singleton类,这样它就保留了一个实例,你可以使用接口和广播接收器来满足你的需求,我希望使用相同的片段,但我希望在每次menuItem单击时调用oncreateview,因为我传递的是不同的bundle参数,我需要在oncreateview中为其调用不同的API,从而导致不同的布局。有关更多详细信息,请参阅这有助于传递消息,但捕获是presenter.fetchCategories(reportType,false,true);在oncreate视图中。当我将片段替换为自身时,此方法不会强制再次调用oncreate视图。如果未再次调用oncreate视图,如何使用传递的参数重新绘制布局?您可以在onreceive presenter.fetchCategories(reportType,false,true)中调用此函数;您有单布局还是多布局?带回收器视图的单布局。我将进行更改,并会让您知道这是否有效。非常感谢。还有一件事,我是否需要在每个交换机案例中与sendBroadcast一起调用replaceFragment(new ReportCategoryFragment(),false,R.id.container)?
unregisterReceiver(broadCastNewMessage);
Intent intent = new Intent("update_fragment");
intent.putExtra("some_msg", message); 
sendBroadcast(intent);