我有一个Fragment Pager Adapter
,其中5个片段带有RecyclerView
,所有相同但最后一个片段都有一个改变内容的按钮,当我按下此按钮时会打开{{1}这将取代Dialog Fragment
的所有内容。
只有当RecyclerView
打开时我将应用程序发送到后台,当我恢复应用程序并提交更改时,应用程序崩溃,表明Dialog Fragment
为空,我的问题就出现了。
恢复后如何恢复片段的完整状态。
通过记录生命周期,我可以看到在运行简历RecyclerView
之后,但我的方法OnCreate, OnCreateView & OnActivityCreated
报告setUpCustomPatternsRecyclerView
为空。
下面是我的片段代码(非常简单)
重要提示:只有当我在手机中尝试使用4个不同的模拟器时App才会崩溃,App不会崩溃。
是不是我的手机没有完全绘制用户界面?
如果是这样,我怎么能得到通知它被完全抽出?
片段:
RecyclerView
LifeCycle的Emulator(API22& API26)logcat重新创建错误:
public static FragmentCustomPatterns newInstance(ArrayList<PatternArrays> patternArrays, String fragmentTitle, int patternSelectedMode) {
FragmentCustomPatterns patterns = new FragmentCustomPatterns();
Bundle args = new Bundle();
args.putParcelableArrayList(CUSTOM_PATTERNS, patternArrays);
args.putInt(PATTERN_SELECTED_MODE, patternSelectedMode);
args.putString(TITLE, fragmentTitle);
patterns.setArguments(args);
return patterns;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
patternSelectedMode = getArguments().getInt(PATTERN_SELECTED_MODE);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
openCustomCoordinatesFragment = (OpenCustomCoordinatesFragment) getActivity();
View view = inflater.inflate(R.layout.fragment_custom_patterns, container, false);
FloatingActionButton floatingActionButton = view.findViewById(R.id.fab_custom_patterns);
floatingActionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
openCustomCoordinatesFragment.openCoordinatesDialog();
}
});
recyclerFlag = false;
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
activityPatternSelector = (ActivityPatternSelector) getActivity();
setUpCustomPatternsRecyclerView();
}
public void setUpCustomPatternsRecyclerView() {
recyclerPatternsView = getView().findViewById(R.id.custom_pattern_recycler_view);
adapter = new PatternCoordinatesAdapter(getActivity(),activityPatternSelector.getCustomPatternArrays(), patternSelectedMode);
recyclerPatternsView.setAdapter(adapter);
Utilities utilities = new Utilities(getActivity(), R.layout.item_coordinates_pattern_cardview);
GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), utilities.calculateNoOfColumns());
recyclerPatternsView.setLayoutManager(gridLayoutManager);
recyclerPatternsView.setItemAnimator(new DefaultItemAnimator());
if (!recyclerFlag) {
recyclerPatternsView.addItemDecoration(new GridSpacing(utilities.calculateSpacing()));
recyclerFlag = true;
}
}
public interface OpenCustomCoordinatesFragment {
void openCoordinatesDialog();
}
LifeCycle的Logcat(API25)logcat重新创建错误:
E/TESTING ACT: onPause:
D/TESTING FRAG: onPause:
E/TESTING ACT: onSaveInstanceState:
D/TESTING FRAG: onSaveInstanceState:
D/TESTING FRAG: onResume:
两者完全不同我将在手机logcat上工作以在E/TESTING ACT: onPause:
D/TESTING FRAG: onPause:
E/TESTING ACT: onSaveInstanceState:
D/TESTING FRAG: onSaveInstanceState:
E/TESTING ACT: onCreate:
D/TESTING FRAG: onCreate:
E/TESTING ACT: onCreate: Array Size 25
D/TESTING FRAG: onCreateView:
D/TESTING FRAG: onActivityCreated:
D/TESTING FRAG: onActivityCreated: Array Size 25
D/TESTING FRAG: onResume:
中创建一个Bundle。请注意,模拟器OnSaveInstanceState
在OnResume
之后在OnSavedInstanceState
之后的电话上调用,并且没有其他方法被调用。
有人可以解释物理设备和模拟器之间的生命周期差异吗?
更新
我无法找到解决方法。在托管OnActivityCreated
的活动中运行,该活动也会启动FragmentPagerAdapter
:
DialogFragment
在正常情况下返回:
final FragmentCustomPatterns myTempFrag = (FragmentCustomPatterns) patternsPagerAdapter.getItem(4);
System.out.println("TESTING: Added " + myTempFrag.isAdded() + " Visible " + myTempFrag.isVisible() + " In Layout " + myTempFrag.isInLayout() + " Resumed " + myTempFrag.isResumed() + " Count " + patternsPagerAdapter.getCount());
将应用程序发送到后台并打开Dialog Fragment后再返回应用程序,返回:
TESTING: 'Added' true 'Visible' true 'In Layout' false 'Resumed' true Count 5
我认为这就是我得到的原因:
TESTING: 'Added' false 'Visible' false 'In Layout' false 'Resumed' false Count 5
这是否意味着片段不在那里? 我如何解释这最后一条消息? 如何修复“已添加”#39;真的吗?
PARTIAL FIX:
我有一个&#34;重启活动&#34;方法,我用它来修复&#34;我的问题,但新手,因为我,我不认为这是正确的答案。
答案 0 :(得分:1)
在RecyclerView
上设置onCreateView
,恢复应自动进行。
关于生命周期:存在差异是因为您的模拟器没有破坏您的活动/片段和您的设备,可能是因为模拟器有更多内存。
如果您在重新打开自己的应用之前已经在模拟器上打开了更多应用,那么您将拥有相同的功能。或者,如果您在模拟器上放置了开发人员选项&#34;请不要保留活动&#34; on,模仿这种行为:一种设备会立即破坏你的活动和碎片,因为它想在其他地方使用内存。
因此,任何设备/模拟器都可以执行您看到的两个路径中的任何一个。你应该支持两者。