2016-04-07 6 views
0

私は、いくつかのアイテムを含むナビゲーションビューを持っています。あるアイテムが押されると、そのフラグメントに移動します。たとえば、「ホーム」項目を押すと、引き出しの上にホームフラグメントが表示されます。フラグメントを破壊しないようにするにはどうしたらいいですか?

 navigationView = (NavigationView)findViewById(R.id.navigation_view); 
     navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { 
     @Override 
     public boolean onNavigationItemSelected(MenuItem item) { 
      switch (item.getItemId()) { 
       case R.id.home_id: 
        HomeFragment homeFragment = (HomeFragment) fragmentManager.findFragmentByTag("Home"); 
        if (homeFragment == null) 
         homeFragment = new HomeFragment(); 
        fragmentTransaction = fragmentManager.beginTransaction(); 
        fragmentTransaction.replace(R.id.Main, homeFragment, "Home"); 
        fragmentTransaction.commit(); 
        getSupportActionBar().setTitle("Home"); 
        item.setChecked(true); 
        drawerLayout.closeDrawers(); 
        break; 

       case R.id.chat_id: 
        ChatFragment chatFragment = (ChatFragment) fragmentManager.findFragmentByTag("Chat"); 
        if (chatFragment == null) 
         chatFragment = new ChatFragment(); 
        fragmentTransaction = fragmentManager.beginTransaction(); 
        fragmentTransaction.replace(R.id.Main, chatFragment, "Chat"); 
        fragmentTransaction.commit(); 
        getSupportActionBar().setTitle("Chat"); 
        item.setChecked(true); 
        drawerLayout.closeDrawers(); 
        break; 
      } 

     } 
    } 

それでは、私だと思うが起こっていることは、私はreplace()メソッドを使用していたときに、それがチャットフラグメントを破壊していることです。チャット・フラグメントのデータを持っていて、フラグメントを変更したときにデータが消えないようにしたいのですが?私は、このオーバーライドメソッドを入れているChatFragmentクラスで

:私は私のアプリでフラグメントを切り替える際さて、このメソッドが呼び出されません

@Override 
public void onSaveInstanceState(Bundle outState) 
{ 
    Log.d("CHATFRAG", "onSaveInstanceState: been called "); 
    super.onSaveInstanceState(outState); 
    outState.putString("textView",textView.getText().toString()); 
    //Save the fragment's state here 
} 

、断片を意味破壊されています。

画面に表示されている現在のフラグメントを、目的のフラグメント(両方を破壊することなく)と入れ替えることのできる方法はありますか? 私は断片(最大10個)を持つでしょう、重複したコードを必要としない最適化されたソリューションはありますか?あなたのナビゲーションコードで次に

private HomeFragment homeFragment; 
private ChatFragment chatFragment; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.my_activity); 

    homeFragment = new HomeFragment(); 
    chatFragment = new ChatFragment(); 
} 

+0

フラグメントを置き換えた場合、置き換えられるフラグメントは破棄されます。つまり、フラグメントのライフサイクルです。あなたが失うことがないデータを持っているなら、あなたはそのデータを装置のどこかに格納するべきです – tyczj

答えて

2

あなたが他とのフラグメントを交換しているので、最初の1途絶えるだろう。あなたが望むいけない場合、それはあなたが、私はラヴィRupareliyaの答えは、私が働くかもしれないと思う別の方法を共有しましょう(.addを使用して)最良の選択だと思いますがreplace

fragmentTransaction.add(R.id.Main, homeFragment, "Home"); 
+0

このフラグメントを追加すると、現在オンになっているフラグメントはどうなりますか? – Moynul

+0

これはバックグラウンドで実行されます。 –

+0

そのため、大部分のアプリケーションでフラグメントがスタックされますか? 1つはケーキの層のように、別のものの上に?これはアンドロイドアプリケーションに最適ですか? – Moynul

3

あなたは、あなたの活動のonCreate()方法では、たとえば、事前にあなたの断片を作成することができます

@Override 
public boolean onNavigationItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.home_id: 
      if (homeFragment == null) 
       homeFragment = new HomeFragment(); 
      fragmentTransaction = fragmentManager.beginTransaction(); 
      fragmentTransaction.replace(R.id.Main, homeFragment, "Home"); 
      fragmentTransaction.commit(); 
      getSupportActionBar().setTitle("Home"); 
      item.setChecked(true); 
      drawerLayout.closeDrawers(); 
      break; 

     case R.id.chat_id: 
      if (chatFragment == null) 
       chatFragment = new ChatFragment(); 
      fragmentTransaction = fragmentManager.beginTransaction(); 
      fragmentTransaction.replace(R.id.Main, chatFragment, "Chat"); 
      fragmentTransaction.commit(); 
      getSupportActionBar().setTitle("Chat"); 
      item.setChecked(true); 
      drawerLayout.closeDrawers(); 
      break; 
    } 
} 
+0

"断片を置き換えると、置き換えられた断片が破壊されます。つまり断片のライフサイクルです。 tvcjとして、replaceメソッドを使用すると、そのインスタンスを破壊すると発表したので、あなたは、 – Moynul

+0

申し訳tyczjデバイス」のどこかにそのデータを格納する必要があり、そのフラグメントは常にnullになり、私は画面を変更するたびにインスタンス化する必要がありますか? – Moynul

+0

@Moynulはい、断片オブジェクトへの参照を保持しない場合はそうです。私の例では、あなたのアクティビティにうまく格納されているので、望むようにスワップすることができます。あなたが活動を辞めるまで、彼らは完全に破壊されません。 – manabreak

1

するのではなく、それをaddする必要が破壊します。

FrameLayoutを2つ追加して.addFragmentの両方に追加してから、それらの表示を交互に表示できます。

+1

はい、私は同意します。Raviは実際には、アフターケアのための@manbreak、私の質問への明確な返答。だから私は同じレイアウトにフラグメントを追加します。私が画面を切り替えると、私は 'Fragment'オブジェクトから' isAdded() 'メソッドを使います。そうであれば、 'FragmentTranction'オブジェクトで' hide() 'を使って他のフラグメントを見えなくします。 'Fragment'オブジェクトを確実に削除するためのキーが削除されなかったのは、この2つの方法です。 'Unreal4'や' Unity3D'でコーディングしたことがあるなら、画面を表示したり隠したりするのと同じ考えが使われます。入力いただきありがとうございます。 – Moynul

関連する問題