2017-07-27 36 views
0

我有一個Activity,其中只包含一個FrameLayout,它顯示FragmentFragment只包含一個ButtononCreateView在定位更改後重新創建片段後運行兩次

該應用程序的工作原理是按鈕的背景顏色隨着點擊按鈕而改變。片段接收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-nullsavedInstanceState,但第二次,savedInstanceState變成null(我已經使用調試器觀察到了這一點)。因此,在重新創建片段時,按鈕的顏色總是變爲紅色,這是color Array第一個索引處的顏色,並且看起來應用程序的state根本沒有被保存。

這是怎麼發生的?

回答

1

onCreate您的活動在您旋轉時會再次被調用,這意味着將創建另一個片段並將其添加到您的frameLayout。舊的將被重新創建,所以你有兩個。檢查Activity onCreate中的savedInstanceState。如果它不是null,那麼你的Activity被重新創建,並且很可能Fragment已經存在。您也可以執行fragmentManager.findFragmentById(id)並在再次添加之前檢查它是否存在。

+0

謝謝你,這工作得很好。我還想知道,當我們聲明:fragment a = new fragment()時是否重新創建舊片段,或者片段管理器是否記住舊片段,並在活動重新創建後立即重新創建它? @ono –

+0

FragmentManager重新創建它,因爲你第一次添加它。所以你只需要在'setContentView'之後運行一次代碼。 – ono

相關問題