簡體   English   中英

應用程序不保留方向更改時對象的狀態

[英]application does not retain state of objects on orientation change

我有一個顯示電阻器(復合圖像)的應用程序,在它下方是四個數字選擇器,供用戶選擇值...一切工作正常,直到方向發生變化,並且在創建i時不重新創建用戶界面期望保留數字選擇器和圖像視圖的所有顯示值...我的保存方法出了什么問題?

這是我的主要活動課

public class MainActivity extends Activity {

    RelativeLayout rl;
    TextView resistorValue;
    MyImageView bandOne, bandTwo, bandThree, tolerance;
    int figureOne;
    int figureTwo;
    int multiplier;
    String toleranceRate;
    String resistanceDisplayed;
    MyNumberPicker pickerOne;
    MyNumberPicker pickerTwo;
    MyNumberPicker pickerThree;
    MyNumberPicker pickerTolerance;
    SharedPreferences prefs;
    SharedPreferences.Editor editor;
    String colorSelected;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //gets shared preferences
        prefs = getSharedPreferences("myPrefs", MODE_PRIVATE);
        editor = prefs.edit();

        //initialize the user interface objects
        rl = (RelativeLayout)findViewById(R.id.main_layout);
        bandOne = (MyImageView)findViewById(R.id.colorOne);
        bandTwo = (MyImageView)findViewById(R.id.colorTwo);
        bandThree = (MyImageView)findViewById(R.id.colorThree);
        tolerance = (MyImageView)findViewById(R.id.Tolerance);
        resistorValue = (TextView)findViewById(R.id.resValue);

        pickerOne = (MyNumberPicker)findViewById(R.id.bandOne);
        pickerTwo = (MyNumberPicker)findViewById(R.id.bandTwo);
        pickerThree = (MyNumberPicker)findViewById(R.id.bandThree);
        pickerTolerance = (MyNumberPicker)findViewById(R.id.bandTolerance);

        //checks for shared preferences 
        colorSelected = prefs.getString("background_color", "WHITE");
        if(colorSelected.equals("RED")){
            rl.setBackgroundColor(Color.RED);
        }else if(colorSelected.equals("GREEN")){
            rl.setBackgroundColor(Color.GREEN);
        }else if(colorSelected.equals("BLUE")){
            rl.setBackgroundColor(Color.BLUE);
        }else if(colorSelected.equals("BLACK")){
            rl.setBackgroundColor(Color.BLACK);
        }else{
            rl.setBackgroundColor(Color.WHITE);
        }

        if(savedInstanceState != null){
            bandOne = (MyImageView)savedInstanceState.getSerializable("bandOne");
            bandTwo = (MyImageView)savedInstanceState.getSerializable("bandTwo");
            bandThree = (MyImageView)savedInstanceState.getSerializable("bandThree");
            tolerance = (MyImageView)savedInstanceState.getSerializable("tolerance");
            pickerOne = (MyNumberPicker)savedInstanceState.getSerializable("pickerOne");
            pickerTwo = (MyNumberPicker)savedInstanceState.getSerializable("pickerTwo");
            pickerThree = (MyNumberPicker)savedInstanceState.getSerializable("pickerThree");

        }

        pickerOne.setMinValue(0);
        pickerOne.setMaxValue(9);
        pickerTwo.setMinValue(0);
        pickerTwo.setMaxValue(9);
        pickerThree.setMinValue(0);
        pickerThree.setMaxValue(9);
        pickerTolerance.setMinValue(0);
        pickerTolerance.setMaxValue(3);

        //sets the displayed values of the number pickers
        pickerOne.setDisplayedValues(new String[] { "Black", "Brown", "Red",
                "Orange", "Yellow", "Green", "Blue", "Violet", "Grey",
                "White" });
        pickerTwo.setDisplayedValues(new String[] { "Black", "Brown", "Red",
                "Orange", "Yellow", "Green", "Blue", "Violet", "Grey",
                "White" });
        pickerThree.setDisplayedValues(new String[] { "Black", "Brown", "Red",
                "Orange", "Yellow", "Green", "Blue", "Violet", "Grey",
                "White" });

        pickerTolerance.setDisplayedValues(new String[] { "Brown", "Red", "Gold", "Silver"});

        //triggered when numberPickers value are changed
        pickerOne.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {

            @Override
            public void onValueChange(NumberPicker picker, int oldVal, int newVal) {

                switch (newVal) {
                case 0:
                    bandOne.setImageResource(R.drawable.black);
                    bandOne.setTag(Integer.valueOf(R.drawable.black));
                    figureOne = 0;
                    break;
                case 1:
                    bandOne.setImageResource(R.drawable.brown);
                    bandOne.setTag(Integer.valueOf(R.drawable.brown));
                    figureOne = 1;
                    break;
                case 2:
                    bandOne.setImageResource(R.drawable.red);
                    figureOne = 2;
                    break;
                case 3:
                    bandOne.setImageResource(R.drawable.orange);
                    figureOne = 3;
                    break;
                case 4:
                    bandOne.setImageResource(R.drawable.yellow);
                    figureOne = 4;
                    break;
                case 5:
                    bandOne.setImageResource(R.drawable.green);
                    figureOne = 5;
                    break;
                case 6:
                    bandOne.setImageResource(R.drawable.blue);
                    figureOne = 6;
                    break;
                case 7:
                    bandOne.setImageResource(R.drawable.violet);
                    figureOne = 7;
                    break;
                case 8:
                    bandOne.setImageResource(R.drawable.grey);
                    figureOne = 8;
                    break;
                case 9:
                    bandOne.setImageResource(R.drawable.white);
                    figureOne = 9;
                    break;
                }
                calculateResistorValue();
            }
        });

        pickerTwo.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {

            @Override
            public void onValueChange(NumberPicker picker, int oldVal, int newVal) {

                switch (newVal) {
                case 0:
                    bandTwo.setImageResource(R.drawable.black);
                    figureTwo = 0;
                    break;
                case 1:
                    bandTwo.setImageResource(R.drawable.brown);
                    figureTwo = 1;
                    break;
                case 2:
                    bandTwo.setImageResource(R.drawable.red);
                    figureTwo = 2;
                    break;
                case 3:
                    bandTwo.setImageResource(R.drawable.orange);
                    figureTwo = 3;
                    break;
                case 4:
                    bandTwo.setImageResource(R.drawable.yellow);
                    figureTwo = 4;
                    break;
                case 5:
                    bandTwo.setImageResource(R.drawable.green);
                    figureTwo = 5;
                    break;
                case 6:
                    bandTwo.setImageResource(R.drawable.blue);
                    figureTwo = 6;
                    break;
                case 7:
                    bandTwo.setImageResource(R.drawable.violet);
                    figureTwo = 7;
                    break;
                case 8:
                    bandTwo.setImageResource(R.drawable.grey);
                    figureTwo = 8;
                    break;
                case 9:
                    bandTwo.setImageResource(R.drawable.white);
                    figureTwo = 9;
                    break;
                }
                calculateResistorValue();
            }
        });

        pickerThree.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {

            @Override
            public void onValueChange(NumberPicker picker, int oldVal, int newVal) {

                switch (newVal) {
                case 0:
                    bandThree.setImageResource(R.drawable.black);
                    multiplier = 0;
                    break;
                case 1:
                    bandThree.setImageResource(R.drawable.brown);
                    multiplier = 1;
                    break;
                case 2:
                    bandThree.setImageResource(R.drawable.red);
                    multiplier = 2;
                    break;
                case 3:
                    bandThree.setImageResource(R.drawable.orange);
                    multiplier = 3;
                    break;
                case 4:
                    bandThree.setImageResource(R.drawable.yellow);
                    multiplier = 4;
                    break;
                case 5:
                    bandThree.setImageResource(R.drawable.green);
                    multiplier = 5;
                    break;
                case 6:
                    bandThree.setImageResource(R.drawable.blue);
                    multiplier = 6;
                    break;
                case 7:
                    bandThree.setImageResource(R.drawable.violet);
                    multiplier = 7;
                    break;
                case 8:
                    bandThree.setImageResource(R.drawable.grey);
                    multiplier = 8;
                    break;
                case 9:
                    bandThree.setImageResource(R.drawable.white);
                    multiplier = 9;
                    break;
                }
                calculateResistorValue();
            }
        });

        pickerTolerance.setOnValueChangedListener(new NumberPicker.OnValueChangeListener(){

            @Override
            public void onValueChange(NumberPicker picker, int oldVal, int newVal){
                switch(newVal){
                case 0:
                    tolerance.setImageResource(R.drawable.brown);
                    toleranceRate = "1%";
                    break;
                case 1:
                    tolerance.setImageResource(R.drawable.red);
                    toleranceRate = "2%";
                    break;
                case 2:
                    tolerance.setImageResource(R.drawable.gold);
                    toleranceRate = "5%";
                    break;
                case 3:
                    tolerance.setImageResource(R.drawable.silver);
                    toleranceRate = "10%";
                    break;  
                }
                calculateResistorValue();
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.preferences_background_color) {
            CharSequence colors[] = new CharSequence[] {"red","green", "blue", "black"};
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("Pick a color");
            builder.setItems(colors, new DialogInterface.OnClickListener() {

                //opens a dialog that let the user choose the background color and saves it to shared preferences
                @Override
                public void onClick(DialogInterface dialog, int which) {

                    switch(which){
                    case 0:
                        rl.setBackgroundColor(Color.RED);
                        colorSelected="RED";
                        editor.putString("background_color", colorSelected);
                        editor.commit();
                        break;
                    case 1:
                        rl.setBackgroundColor(Color.GREEN);
                        colorSelected="GREEN";
                        editor.putString("background_color", colorSelected);
                        editor.commit();
                        break;
                    case 2:
                        rl.setBackgroundColor(Color.BLUE);
                        colorSelected="BLUE";
                        editor.putString("background_color", colorSelected);
                        editor.commit();
                        break;
                    case 3:
                        rl.setBackgroundColor(Color.BLACK);
                        colorSelected="BLACK";
                        editor.putString("background_color", colorSelected);
                        editor.commit();
                        break;
                    default:
                        rl.setBackgroundColor(Color.WHITE);
                        break;
                    }
                }
            });
            builder.show();
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        outState.putSerializable("bandOne", bandOne);
        outState.putSerializable("bandTwo", bandTwo);
        outState.putSerializable("bandThree", bandThree);
        outState.putSerializable("tolerance", tolerance);
        outState.putSerializable("pickerOne", pickerOne);
        outState.putSerializable("pickerTwo", pickerTwo);
        outState.putSerializable("pickerThree", pickerThree);
        super.onSaveInstanceState(outState);
    }

    //calculates the resistor value and sets text of textView
    public void calculateResistorValue(){

        double resValue = ((10 * figureOne) + figureTwo) * Math.pow(10, multiplier) / 1000;
        String resMessage = null;
        if(resValue >= (10^6)){
            resValue /= (10^6);
            resMessage= Integer.toString((int) resValue) + "  M Ohms";
        }else if(resValue >= (10^3)){
            resValue /= (10^3);
            resMessage = Integer.toString((int) resValue) + "  k Ohms";
        }else{
            resMessage = Integer.toString((int) resValue) + "  Ohms";
        }
        resistorValue.setText(resMessage + "  " + toleranceRate );
    }       
}

另外,我還具有XML文件的自定義類“我的號碼選擇器”和“我的圖像視圖”(它們可以正常工作),我相信一旦對象被反序列化,錯誤就出在我的save方法或On Create方法中。

![電阻圖片] http://www.electronics123.com/page/calculate-resistor-values

您正在嘗試將太多數據保存到捆綁軟件中。 只保存您需要的內容,也許將NumberPicker更改的值存儲到主活動類的成員中,然后使用這些成員保存數據。 您可以將NumberPicker.OnValueChangedListener中的邏輯移動到通用函數,並在方向更改后擁有活動實例時在onCreate上調用此函數。 您將僅從包中加載簡單的原始值,而不是復雜的視圖對象。

編輯您已經在使用成員的吶喊,只需創建一個函數並保存/加載捆綁包中的值,然后調用該函數即可恢復號碼選擇器!

嘗試只保存值:

    @Override
    public void onSaveInstanceState(Bundle outState) {
        outState.putInt("figureOne", pickerOne);
        outState.putInt("figureTwo", pickerTwo);
        outState.putInt("multiplier", multiplier);
        outState.putInt("tolerance", pickerTolerance.getValue());
        super.onSaveInstanceState(outState);
    }

在onCreate()中,具有設置所有偵聽器之后恢復值的代碼。 恢復值的代碼如下:

        if(savedInstanceState != null){
            pickerOne.setValue(savedInstanceState.getInt("figureOne"));
            pickerTwo.setValue(savedInstanceState.getInt("figureTwo"));
            pickerThree.setValue(savedInstanceState.getInt("multiplier");
            pickerTolerance.setValue(savedInstanceState.getInt("tolerance"));
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM