onCreateView在Orientation Change之后重新创建片段后运行两次

时间:2017-07-27 18:29:35

标签: android android-fragments

我的Activity只包含显示FrameLayout的{​​{1}}。 Fragment仅包含Fragment

应用程序的工作是单击按钮时按钮的背景颜色发生变化。 Fragment从Button中定义的数组中获取颜色值。

活动的代码是:

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(我已经使用调试器观察到了这一点)。因此,在重新创建片段时,按钮的颜色总是变为RED,这是null的第一个索引处的颜色,看起来好像应用的color Array根本没有被保存。

为什么会这样?

1 个答案:

答案 0 :(得分:3)

旋转时再次调用活动中的

onCreate,这意味着将创建另一个片段并将其添加到frameLayout。旧的将重建,所以你有两个。检查Activity onCreate中的savedInstanceState。如果它不为null,则重新创建Activity,并且片段可能已存在。您也可以执行fragmentManager.findFragmentById(id)并在再次添加之前检查它是否存在。

相关问题