2012-04-30 12 views
4

その状態を失った私は2つの断片を表示する活性を有する:アクティビティが作成されるとフラグメントは時に回転デバイス倍

  • 、それはFragment1が表示されます。
  • ユーザーがFragment1のボタンを押すと、Fragment2と表示され、バックスタックに追加されます。

フラグメントは簡単です。 Fragment1は、CheckBoxおよびEditTextを含む。 Fragment2には簡単なTextViewが含まれています。また、フラグメントのonCreate(...)メソッドでsetRetainInstance(true)と呼んでいます。

問題Fragment1Fragment2が表示され、デバイスが二回回転させた場合、その状態を失います。ただし、デバイスが回転する場合はすべての場合はすべて正常に動作します。

再現手順:

  1. 起動アプリケーションを。
  2. バックに戻るにチェックCheckBox
  3. 再びFragment2
  4. 回しデバイス
  5. 回しデバイスを起動するために押しButtonEditText
  6. にいくつかのテキストを入力するキーを押しBackお使いのデバイス上のボタン(またはエミュレータ上ESCFragment1

Fragment1 sta te(チェックボックスはチェックされず、EditTextは空です)。 step#4の後にFragment1に戻ると、Fragment1は期待どおりの状態を維持します。

問題はどこですか?すべてのコードはレイアウトを含めて下にあります。

main.xml

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/placeholder" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

fragment1.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <CheckBox 
     android:id="@+id/checkBox1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="CheckBox" /> 

    <EditText 
     android:id="@+id/editText1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 
    </EditText> 

    <Button 
     android:id="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Start Fragment2" /> 

</LinearLayout> 

fragment2.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Fragment #2" /> 

</LinearLayout> 

FragmentTestActivity.java

package fragmenttest.example.com; 

import android.app.Activity; 
import android.app.FragmentManager; 
import android.os.Bundle; 

public class FragmentTestActivity extends Activity implements FragmentListener { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     FragmentManager fm = getFragmentManager(); 
     if (fm.findFragmentByTag(Fragment1.TAG) == null) { 
      fm.beginTransaction().replace(R.id.placeholder, new Fragment1(), Fragment1.TAG).commit(); 
     } 
    } 

    @Override 
    public void onButtonClick() { 
     FragmentManager fm = getFragmentManager(); 
     if (fm.findFragmentByTag(Fragment2.TAG) == null) { 
      fm.beginTransaction().replace(R.id.placeholder, new Fragment2(), Fragment2.TAG).addToBackStack(Fragment2.TAG).commit(); 
     } 
    } 
} 

Fragment1。Javaの

package fragmenttest.example.com; 

import android.app.Activity; 
import android.app.Fragment; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.Button; 

public class Fragment1 extends Fragment { 
    public static final String TAG = Fragment1.class.getName(); 
    private FragmentListener mListener; 

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

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View root = inflater.inflate(R.layout.fragment1, container, false); 

     Button button = (Button) root.findViewById(R.id.button1); 
     button.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mListener.onButtonClick(); 
      } 
     }); 

     return root; 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 

     mListener = (FragmentListener) activity; 
    } 
} 

Fragment2.java

package fragmenttest.example.com; 

import android.app.Fragment; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class Fragment2 extends Fragment { 
    public static final String TAG = Fragment2.class.getName(); 

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

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

FragmentListener.java

package fragmenttest.example.com; 

public interface FragmentListener { 
    public void onButtonClick(); 
} 

答えて

関連する問題