Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
屏幕旋转时重置android片段savedInstanceState值_Android_Android Fragments_Orientation - Fatal编程技术网

屏幕旋转时重置android片段savedInstanceState值

屏幕旋转时重置android片段savedInstanceState值,android,android-fragments,orientation,Android,Android Fragments,Orientation,我正在做一个项目,遇到了一个我似乎无法理解为什么会发生的错误。问题是,当我翻转手机的方向时,我想保存score的值。当我记录score的值时,我注意到了一个问题,即当我更改手机方向时,onCreateView似乎被调用了两次。在第一次调用的日志中,它似乎保存了score的值,但随后再次调用它,清除了score的值 为什么onCreateView会被调用两次并重置score的值 如何修复它,以便只调用一次onCreateView public class SteeringFragment ext

我正在做一个项目,遇到了一个我似乎无法理解为什么会发生的错误。问题是,当我翻转手机的方向时,我想保存score的值。当我记录score的值时,我注意到了一个问题,即当我更改手机方向时,
onCreateView
似乎被调用了两次。在第一次调用的日志中,它似乎保存了score的值,但随后再次调用它,清除了score的值

  • 为什么
    onCreateView
    会被调用两次并重置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);
    }
    
    }


在片段代码中尝试存储以下行:

if (savedInstanceState != null) {
    score = savedInstanceState.getInt("score");
}

在片段的
onCreate
方法中,每次旋转设备时都会调用
onCreateView
(因为UI被重新绘制),并且它们的一些参数将被清除

嗨,请读。这可能会有帮助。我看到了这一点,现在我明白了为什么会发生这种情况,但我不明白他对如何修复它的解释。不幸的是,这也不起作用,问题仍然在发生。您可以尝试使用断点查看在旋转设备时savedInstanceState值会发生什么情况。