我的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
根本没有被保存。
为什么会这样?
答案 0 :(得分:3)
onCreate
,这意味着将创建另一个片段并将其添加到frameLayout
。旧的将重建,所以你有两个。检查Activity onCreate中的savedInstanceState
。如果它不为null,则重新创建Activity,并且片段可能已存在。您也可以执行fragmentManager.findFragmentById(id)
并在再次添加之前检查它是否存在。