【发布时间】: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,从而导致不同的布局.