【问题标题】:OnCreateView not called again after replacing with the same fragment用相同的片段替换后不再调用 OnCreateView
【发布时间】:2018-06-12 06:10:45
【问题描述】:

我正在使用带有工具栏中不同项目的下拉菜单。在活动中,我会在单击菜单项后立即添加片段。片段 OnCreateview 被调用并从 API 中获取数据。所有菜单项的数据获取逻辑保持不变,但只有 API 端点不同。因此,我尝试使用 API 端点名称传递 Bundle,并对所有项目使用相同的片段。但问题是 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;
      }
     }

报告类别片段

    @Nullable
@Override
public View onCreateView(LayoutInflater inflater,
                         @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    rootView = inflater.inflate(R.layout.fragment_runreport, container, false);
    setHasOptionsMenu(true);
    ButterKnife.bind(this, rootView);
    presenter.attachView(this);
    reportType = getArguments().getString("hash-key");
    Log.v("hashkey",reportType);
    presenter.fetchCategories(reportType, false, true);

    return rootView;
}

替换片段函数

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

【问题讨论】:

  • 使用单例片段并在其构造函数中传递值
  • @quicklearner 在接受的答案中提到“片段是应用程序的可重用组件。您不应该将它们用作单例”。还有其他可能的解决方案吗?
  • 我认为如果你想使用相同的片段,你可以使用单例类,这样它就可以保持一个实例,你可以使用接口和广播接收器来满足你的要求
  • 是的,我想使用相同的片段,但我希望在每次 menuItem 单击时调用 oncreateview,因为我传递了不同的捆绑参数,我需要在 oncreateview 中调用不同的 API,从而导致不同的布局.

标签: android android-fragments


【解决方案1】:

简单的解决方案是使用 Broadcast Receiver 在你的 fragment 类中声明这个

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()

unregisterReceiver(broadCastNewMessage);

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

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

【讨论】:

  • 这有助于传递消息,但问题是 presenter.fetchCategories(reportType, false, true); 在 oncreate 视图中。当我用它自己替换片段时,这种方法不会强制再次调用 oncreate 视图。如果没有再次调用 Oncreate View,如何使用传递的参数重绘布局?
  • 你可以在onreceivepresenter.fetchCategories(reportType, false, true)中调用这个;
  • 你是单一布局还是多重布局?
  • 带有回收站视图的单一布局。我将进行更改,并让您知道这是否有效。非常感谢。
  • 还有一件事,我是否需要在每个 switch 案例中连同 sendBroadcast 调用 replaceFragment(new ReportCategoryFragment(),false,R.id.container);?跨度>
【解决方案2】:

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多