0

私は、アプリケーションがバックグラウンドで時々殺されるので、アクティビティの現在の断片を復元しようとしています。私はputFragment()を使用して現在のフラグメントをonSaveInstanceState()に保存し、onRestoreInstanceState()getFragment()を使用して、アプリケーションが終了する前に現在のフラグメントの保存されたインスタンスを取得します。これはホスティングアクティビティで行われます。 MainActivityでフラグメントが2回再現される

onSaveInstanceState():MainActivityで

@Override 
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) { 

    getSupportFragmentManager().putFragment(outState, "fragment", getSupportFragmentManager() 
      .findFragmentById(R.id.mainfrag)); 

    super.onSaveInstanceState(outState, outPersistentState); 
} 

onRestoreInstanceState()():

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 

    Fragment current = getSupportFragmentManager().getFragment(savedInstanceState, "fragment"); 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    if (current instanceof SubCat) { 
     current = new SubCat(); 
    } 
    ft.replace(R.id.mainfrag, current); //error-line (MainActivity.java:185) 
    ft.addToBackStack(null); 
    ft.commit(); 
} 

私がテストしSubCat()フラグメントを使用し、それだけの断片の一つですアプリ、したがって、SubCat()フラグメントがフォアグラウンド/可視にあるとき、私は意図的にアプリケーション全体をバックグラウンドに置くか、またはアプリケーションを最小限に抑えて、何らかのt ime、私はアプリに戻ると、最後のフラグメント(この場合はSubCat())が復元されますが、フラグメントのインスタンスも保存する必要があります。

さて問題は、最初はcat_idの実際の値はonActivityCreated()にバンドルから取得されますが、いくつかのフラグメントが再び再作成されており、この時点でonActivityCreated()が値になりますどのと呼ばれていないか、フラグメントが二回再現していることですcat_id nullです。

断片:私は私が間違っているのかわからない

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    arr = new ArrayList<>(); 

    if (getArguments() != null) { 
     String[] data = getArguments().getStringArray("cat_data"); 
     cat_id = data[0]; 
     cat_name = data[1]; 
    } 

} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    if (view == null) { 
     view = inflater.inflate(R.layout.fragment_sub_category, container, false); 

     progress = view.findViewById(R.id.progress); 
     layoutManager = new LinearLayoutManager(getActivity()); 
     recyclerView = view.findViewById(R.id.recycler); 
     recyclerView.setHasFixedSize(true); 
     recyclerView.setLayoutManager(layoutManager); 

     subCatAdapter = new SubCatAdapter(arr, getActivity()); 
     recyclerView.setAdapter(subCatAdapter); 

     subCatAdapter.setOnClickListener(this); 

     doThis(); //request data from server 
    } 

    return view; 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    outState.putString("cat_id", cat_id); 
    outState.putString("cat_name", cat_name); 

    super.onSaveInstanceState(outState); 
} 

@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    if (savedInstanceState != null) { 
     cat_id = savedInstanceState.getString("cat_id"); 
     cat_name = savedInstanceState.getString("cat_name"); 
    } 
} 

は、事前に、感謝を助けてください。

+0

あなたのエラーを共有してください。 – YoLo

+0

エラーはありません.cat_idは空の値を返します。これは想定されていません。アプリがバックグラウンドに進む前に値を持っています。 –

答えて

0

最後に、私はこれを、MainActivityのonSaveInstanceState()onRestoreInstanceState()を取り除いて考え出しました。 をactivityに復元し、fragmentの状態を復元することは何らかの形で冗長であり、onCreateView()fragmentに2回発生させます。したがって、フラグメント状態だけを復元することで作業が完了します。

関連する問題