2016-07-17 5 views
1

フラグメントサブクラスのonSaveInstanceState(Bundle outState)メソッドを使用してデータを保存しようとしています。フラグメントを再作成する前にデータを保存する方法は?

説明:このクラスのFragmentを拡張するクラスFragmentAを作成します。変数名のカウントを持ちます。ボタンをクリックするとcountの値が変更されます(最初のcount = 0)。countの値も保存します。オリエンテーションの変更(縦から横、またはその逆) 私のMainActivityクラスは、断片的に断片的に読み込みます。

私のコード:

このクラスは、フラグメントを拡張: - ここ

public class FragmentA extends Fragment implements View.OnClickListener { 
Button change_After_Click; 
    int count=0; 
    Communicator com; 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if(savedInstanceState!=null){ 
      count=savedInstanceState.getInt("counter",0); 
     } 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.fragment_a_layout, container, false); 
    } 

    @Override 
    public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     System.out.println("onActivityCreated"); 
     com= (Communicator) getActivity(); 
     change_After_Click=(Button)getActivity().findViewById(R.id.textChangeClick); 
     change_After_Click.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View view) { 

count=count+1; 
     com.proviedLinkBothFragment("button click "+ count); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 

     outState.putInt("counter",count); 
    } 
} 

MainActivityクラスiの動的フラグメントをロードします - あなたは既に場合のフラグメントをチェックする必要がありますonCreate活動の方法では

public class MainActivity extends AppCompatActivity implements Communicator { 
Button btn; 
    FragmentManager fragmentManager; 
    FragmentTransaction fragmentTransaction; 
    FragmentB obj; 
    FragmentA objA; 

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

     System.out.println("ge low"); 


        fragmentManager=getSupportFragmentManager(); 
        fragmentTransaction=fragmentManager.beginTransaction(); 
        fragmentTransaction.replace(R.id.relativeLayout,new FragmentA()); 

        fragmentTransaction.commit(); 




    } 



    @Override 
    public void proviedLinkBothFragment(String s) { 

      FragmentB fb= (FragmentB) fragmentManager.findFragmentById(R.id.relativeLayout); 
     fb.changeText(s); 


    } 


} 
+0

'fragmentTransaction.replace(R.id.relativeLayout、new FragmentA());'毎回新しいフラグメントを配置しています。あなたのセーブ/ロード 'count'は正しく見えますが、フラグメントを置き換えているので表示されません。フラグメントが既に存在するかどうかを確認する必要があります。 – njzk2

+0

@ njzk2私は簡単に理解できるように私にコードを教えてください。私は新しい –

答えて

0

それを交換する前に存在します。フラグメントを追加するときは、このフラグメント( "MY_TAG")のタグを使用し、後でタグでフラグメントを見つけることができます。フラグメントを手動で再作成する必要はありません(回転している間)。システムはあなたのためにそれを行います。

fragmentManager=getSupportFragmentManager(); 
if (fragmentManager.findFragmentByTag("MY_TAG") == null) { 
    fragmentTransaction=fragmentManager.beginTransaction(); 
    fragmentTransaction.add(R.id.relativeLayout,new FragmentA(), "MY_TAG"); 

    fragmentTransaction.commit(); 
} 
関連する問題