2016-06-21 11 views
0

このアプリケーションでは抵抗(複合画像)を表示していますが、その下に4つの数値ピッカーがあります。変更され、私は数字ピッカーと画像ビューの表示されたすべての値を保持すると期待するので、ユーザーインターフェイスは再作成されません...何が私の保存メソッドで間違っていますか?私はミスが私の節約であると信じて、ここで アプリケーションはオリエンテーション変更時にオブジェクトの状態を保持しません

は私のメインActivityクラスマイナンバーピッカーと私のイメージビュー

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ファイルでメソッドまたはOn Createメソッドでオブジェクトが逆シリアル化されています。

![抵抗絵] http://www.electronics123.com/page/calculate-resistor-values

+0

:このような値を復元するためのコード。あなたは実際に何を保存しようとしていますか? – ianhanniballake

+0

私は、ユーザーインターフェイスの外観を保存しようとしています、イメージビューのイメージリソースは、onChangeValueListenerのスイッチケースに応じて選択されています...どのように私はこれらの選択された値を保存することができますオリエンテーションの変更 –

+0

NumberPickerやImageViewオブジェクトのようなすべてのビューの状態を保存する –

答えて

0

あなたがバンドルにあまりにも多くのデータを保存しようとしています。必要なものだけを保存し、おそらくNumberPickerの変更の値を主なアクティビティクラスのメンバーに保存し、それらのメンバーを使用してデータを保存します。 NumberPicker.OnValueChangedListenerのロジックを共通の関数に移動し、方向変更後のアクティビティインスタンスがあるときにこの関数をonCreateという名前で呼び出すことができます。複雑なビュー・オブジェクトではなく、バンドルから単純なプリミティブ値をロードするだけです。

編集あなたはメンバーを既に使用しています。機能を作ってバンドルからそれらの値を保存/ロードし、番号ピッカーを復元する機能を呼び出してください。

+0

私は実際にあなたが私にコードの例を教えていただけますか?どのように私はImageViewオブジェクトのimageResourceを変数に保存することができます...画像がdinamically選択されている場合、それを行うことができないかわかりません –

+0

私はonSavedInstanceStateが保存されるため、なぜこれが自動的に行われないのか分かりません私のすべてのビューオブジェクト(ImageViewとNumberPicker)の状態は自動的に更新されます。 –

0

だけで値を保存してみてください。

@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()では、すべてのリスナーがsetted後の値を復元するために、コードを持っています。あなたがあなたの全体のアクティビティを回転させていると、すべてのビューが破壊を取得するとき - あなたは `` onSaveInstanceState(中 `View`)から延びる何かを保存することはできません

 if(savedInstanceState != null){ 
      pickerOne.setValue(savedInstanceState.getInt("figureOne")); 
      pickerTwo.setValue(savedInstanceState.getInt("figureTwo")); 
      pickerThree.setValue(savedInstanceState.getInt("multiplier"); 
      pickerTolerance.setValue(savedInstanceState.getInt("tolerance")); 
     } 
関連する問題