我有一個Activity
,其中只包含一個FrameLayout
,它顯示Fragment
。 Fragment
只包含一個Button
。onCreateView在定位更改後重新創建片段後運行兩次
該應用程序的工作原理是按鈕的背景顏色隨着點擊按鈕而改變。片段接收MainActivity
中定義的數組的顏色值。
該活動的代碼是:
public class MainActivity extends AppCompatActivity {
frag a;
FragmentManager fm;
static int color[] = {Color.RED,Color.BLUE,Color.GREEN};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
a = new frag();
fm = getFragmentManager();
FragmentTransaction ft =
(fm).beginTransaction().add(R.id.framelayout, a);
ft.commit();
}
}
和碎片的代碼是:
public class frag extends Fragment implements View.OnClickListener {
View v;
Button button;
int i = 0;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (savedInstanceState!=null) {
i = (int) savedInstanceState.get("i");
}
v = inflater.inflate(R.layout.fragment_frag, container, false);
button = (Button) v.findViewById(R.id.button);
button.setBackgroundColor(MainActivity.color[i]);
button.setOnClickListener(this);
return v;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("i",i);
}
@Override
public void onClick(View vx) {
i++;
if(i%3==0)
i=0;
button.setBackgroundColor(MainActivity.color[i]);
}
}
的問題是,當屏幕被旋轉,並且片段被重新創建時,onCreateView
運行兩次一個之後。第一次,它有一個non-null
savedInstanceState
,但第二次,savedInstanceState
變成null
(我已經使用調試器觀察到了這一點)。因此,在重新創建片段時,按鈕的顏色總是變爲紅色,這是color Array
第一個索引處的顏色,並且看起來應用程序的state
根本沒有被保存。
這是怎麼發生的?
謝謝你,這工作得很好。我還想知道,當我們聲明:fragment a = new fragment()時是否重新創建舊片段,或者片段管理器是否記住舊片段,並在活動重新創建後立即重新創建它? @ono –
FragmentManager重新創建它,因爲你第一次添加它。所以你只需要在'setContentView'之後運行一次代碼。 – ono