2017-07-27 91 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

相关问题