在片段寻呼机适配器中恢复片段

时间:2017-09-08 08:57:24

标签: android android-fragments android-recyclerview android-dialogfragment fragmentpageradapter

我有一个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。请注意,模拟器OnSaveInstanceStateOnResume之后在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;我的问题,但新手,因为我,我不认为这是正确的答案。

1 个答案:

答案 0 :(得分:1)

RecyclerView上设置onCreateView,恢复应自动进行。

关于生命周期:存在差异是因为您的模拟器没有破坏您的活动/片段和您的设备,可能是因为模拟器有更多内存。

如果您在重新打开自己的应用之前已经在模拟器上打开了更多应用,那么您将拥有相同的功能。或者,如果您在模拟器上放置了开发人员选项&#34;请不要保留活动&#34; on,模仿这种行为:一种设备会立即破坏你的活动和碎片,因为它想在其他地方使用内存。

因此,任何设备/模拟器都可以执行您看到的两个路径中的任何一个。你应该支持两者。