私はプロジェクトに取り掛かっていて、なぜ起きているのかわからないバグにぶち込んでいます。問題は、自分の携帯電話の向きを反転させるときにスコアの価値を保存したいということです。私がスコアの値を記録するとき、私は電話の向きを変えたときにonCreateView
が2回呼び出されるように見えるという問題に気づきます。最初の呼び出し中のログではスコアの値を保存しているように見えますが、スコアの値をクリアしてから再度呼び出されます。アンドロイド・フラグメントsavedInstanceStateの値が画面の回転時にリセットされる
- なぜ
onCreateView
が2回呼び出され、スコアの値がリセットされるのですか? onCreateView
を一度呼び出すように修正するにはどうすればよいですか? (なぜなら、あなたのフラグメントのonCreate
方法でif (savedInstanceState != null) { score = savedInstanceState.getInt("score"); }
と呼ばれるあなたのデバイス
onCreateView
を回転させるたびに:public class SteeringFragment extends Fragment { Drawable transparentRadioButton; RadioButton rbExcellent, rbGood, rbFair, rbPoor, rbFailing; LinearLayout llExcellent, llGood, llFair, llPoor, llFailing; int score; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ((AppCompatActivity)getActivity()).getSupportActionBar().setTitle(R.string.steering_title); // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_steering, container, false); if (savedInstanceState != null){ score = savedInstanceState.getInt("score"); } Log.d("test", String.valueOf(score)); llExcellent = (LinearLayout)view.findViewById(R.id.steeringLLExcellent); llGood = (LinearLayout)view.findViewById(R.id.steeringLLGood); llFair = (LinearLayout)view.findViewById(R.id.steeringLLFair); llPoor = (LinearLayout)view.findViewById(R.id.steeringLLPoor); llFailing = (LinearLayout)view.findViewById(R.id.steeringLLFailing); rbExcellent = (RadioButton)view.findViewById(R.id.steeringRadioExcellent); rbGood = (RadioButton)view.findViewById(R.id.steeringRadioGood); rbFair = (RadioButton)view.findViewById(R.id.steeringRadioFair); rbPoor = (RadioButton)view.findViewById(R.id.steeringRadioPoor); rbFailing = (RadioButton)view.findViewById(R.id.steeringRadioFailing); //used to hide the radio button transparentRadioButton = new ColorDrawable(Color.TRANSPARENT); rbExcellent.setButtonDrawable(transparentRadioButton); rbGood.setButtonDrawable(transparentRadioButton); rbFair.setButtonDrawable(transparentRadioButton); rbPoor.setButtonDrawable(transparentRadioButton); rbFailing.setButtonDrawable(transparentRadioButton); //if score already has value set it to the value if (score != 0){ switch (score){ case 5: rbExcellent.setChecked(true); rbGood.setChecked(false); rbFair.setChecked(false); rbPoor.setChecked(false); rbFailing.setChecked(false); rbExcellent.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.excellentColor)); llExcellent.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.radio_boxes_borders)); break; case 4: rbExcellent.setChecked(false); rbGood.setChecked(true); rbFair.setChecked(false); rbPoor.setChecked(false); rbFailing.setChecked(false); rbGood.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.goodColor)); llGood.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.radio_boxes_borders)); break; case 3: rbExcellent.setChecked(false); rbGood.setChecked(false); rbFair.setChecked(true); rbPoor.setChecked(false); rbFailing.setChecked(false); rbFair.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.fairColor)); llFair.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.radio_boxes_borders)); break; case 2: rbExcellent.setChecked(false); rbGood.setChecked(false); rbFair.setChecked(false); rbPoor.setChecked(true); rbFailing.setChecked(false); rbPoor.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.poorColor)); llPoor.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.radio_boxes_borders)); break; case 1: rbExcellent.setChecked(false); rbGood.setChecked(false); rbFair.setChecked(false); rbPoor.setChecked(false); rbFailing.setChecked(true); rbFailing.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.failingColor)); llFailing.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.radio_boxes_borders)); break; } } rbExcellent.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { rbExcellent.setChecked(true); rbGood.setChecked(false); rbFair.setChecked(false); rbPoor.setChecked(false); rbFailing.setChecked(false); } }); rbGood.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { rbExcellent.setChecked(false); rbGood.setChecked(true); rbFair.setChecked(false); rbPoor.setChecked(false); rbFailing.setChecked(false); } }); rbFair.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { rbExcellent.setChecked(false); rbGood.setChecked(false); rbFair.setChecked(true); rbPoor.setChecked(false); rbFailing.setChecked(false); } }); rbPoor.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { rbExcellent.setChecked(false); rbGood.setChecked(false); rbFair.setChecked(false); rbPoor.setChecked(true); rbFailing.setChecked(false); } }); rbFailing.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { rbExcellent.setChecked(false); rbGood.setChecked(false); rbFair.setChecked(false); rbPoor.setChecked(false); rbFailing.setChecked(true); } }); rbExcellent.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked){ rbExcellent.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.excellentColor)); llExcellent.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.radio_boxes_borders)); score = 5; }else { rbExcellent.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.textColor)); llExcellent.setBackground(null); llExcellent.setPadding(0,0,0,0); } } }); rbGood.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked){ rbGood.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.goodColor)); llGood.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.radio_boxes_borders)); score = 4; }else { rbGood.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.textColor)); llGood.setBackground(null); llGood.setPadding(0,0,0,0); } } }); rbFair.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked){ rbFair.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.fairColor)); llFair.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.radio_boxes_borders)); score = 3; }else { rbFair.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.textColor)); llFair.setBackground(null); llFair.setPadding(0,0,0,0); } } }); rbPoor.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked){ rbPoor.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.poorColor)); llPoor.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.radio_boxes_borders)); score = 2; }else { rbPoor.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.textColor)); llPoor.setBackground(null); llPoor.setPadding(0,0,0,0); } } }); rbFailing.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked){ rbFailing.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.failingColor)); llFailing.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.radio_boxes_borders)); score = 1; }else { rbFailing.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.textColor)); llFailing.setBackground(null); llFailing.setPadding(0,0,0,0); } } }); return view; } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("score", score); }
}あなたのフラグメントのコードで
こんにちは、http://stackoverflow.com/a/10996647/5241603をお読みください。それは助けるかもしれません。 –
私はそれを見ましたが、なぜ今起こっているのか理解していますが、それを修正する方法についての彼の説明は理解していません。 – topgun741