如何在更改方向或切换屏幕时使用 onSavedInstanceState() 保存更改后的图像

How to use onSavedInstanceState() to save altered image when changing orientation or switching screens

我创建了一个接近完成的掷骰子应用程序,但是当屏幕方向改变时我无法保存骰子图像。我一直在摆弄 onSavedInstanceState() 方法,无法弄清楚如何实现这一点。我还注意到,当我切换到新的 activity 屏幕("how to play" 屏幕)然后返回主屏幕时,前一个 activity 的 none 已被保存即使它在改变方向时被保存。

public class MainActivity extends Activity
{
    // declarations
    private Button button;
    private ImageView dice1Image;
    private ImageView dice2Image;
    private TextView roll;
    private TextView point;
    private TextView winTotal;
    private TextView lostTotal;
    private TextView results;

    int winNumber1 = 7;
    int winNumber2 = 11;
    int loseNumber1 = 2;
    int loseNumber2 = 3;
    int loseNumber3 = 12;

    int rounds = 0;
    int rollTotal = 0;
    int pointValue = 0;
    int winsCounter = 0;
    int loseCounter = 0;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        // Get the view from activity_main.xml
        setContentView(R.layout.activity_main);

        dice1Image = (ImageView) findViewById(R.id.imageViewDie01);
        dice2Image = (ImageView) findViewById(R.id.imageViewDie02);
        roll = (TextView) findViewById(R.id.textViewRollTotal);
        point = (TextView) findViewById(R.id.textViewPoint);
        winTotal = (TextView) findViewById(R.id.textViewWonTotal);
        lostTotal = (TextView) findViewById(R.id.textViewLostTotal);
        results = (TextView) findViewById(R.id.results);
        results.setVisibility(View.GONE);
        // Locate the button in activity_main.xml
        button = (Button) findViewById(R.id.howToPlayButton);

        if (savedInstanceState != null) {
            int pointValue = savedInstanceState.getInt("POINT_VALUE");
            int rollTotal = savedInstanceState.getInt("ROLL_TOTAL");
            int winsCounter = savedInstanceState.getInt("WINS_COUNTER");
            int loseCounter = savedInstanceState.getInt("LOSE_COUNTER");
            String result = savedInstanceState.getString("RESULTS");
            int dice1 =  savedInstanceState.getInt("DIE_1", R.id.imageViewDie01);
            int dice2 =  savedInstanceState.getInt("DIE_2", R.id.imageViewDie02);

            roll.setText(String.valueOf(rollTotal));
            point.setText(String.valueOf(pointValue));
            winTotal.setText(String.valueOf(winsCounter));
            lostTotal.setText(String.valueOf(loseCounter));
            results.setText(String.valueOf(result));
        }

我意识到从未使用过 dice1dice2 变量。那就是我被困的地方。我不确定保存图像的最佳方法。这是 onSavedInstanceState()onRestoreInstanceState() 方法:

@Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);

        // Save UI state changes to the savedInstanceState.
        // This bundle will be passed to onCreate if the process is
        // killed and restarted.
        String result = results.getText().toString();
        savedInstanceState.putInt("POINT_VALUE", pointValue);
        savedInstanceState.putInt("ROLL_TOTAL", rollTotal);
        savedInstanceState.putInt("WINS_COUNTER", winsCounter);
        savedInstanceState.putInt("LOSE_COUNTER", loseCounter);
        savedInstanceState.putString("RESULTS", result);
        savedInstanceState.putInt("DIE_1", d1);
        savedInstanceState.putInt("DIE_2", d2);
    }

    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);

        // Restore UI state from the savedInstanceState.
        // This bundle has also been passed to onCreate.
        int pointValue = savedInstanceState.getInt("POINT_VALUE");
        int rollTotal = savedInstanceState.getInt("ROLL_TOTAL");
        int winsCounter = savedInstanceState.getInt("WINS_COUNTER");
        int loseCounter = savedInstanceState.getInt("LOSE_COUNTER");
        String result = savedInstanceState.getString("RESULTS");
        int dice1 =  savedInstanceState.getInt("DIE_1");
        int dice2 =  savedInstanceState.getInt("DIE_2");
    }

我的 rollDice() 方法中使用了 d1d2 变量,它为骰子图像设置了一个值,如下所示:

// set values for dice images
        if(dice1 == 1) {
            dice1Image.setImageResource(R.drawable.die1);
            d1 = 1;
        }....

如有任何帮助,我们将不胜感激。

因此,我没有尝试保存图像,而是将它们重写为根据掷骰子保存的整数显示。

我的onCreate()里面:

        if (savedInstanceState != null) {
            onRestoreInstanceState(savedInstanceState);
        }

这是我的 onSavedInstanceState():

@Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);

        // Save UI state changes to the savedInstanceState.
        // This bundle will be passed to onCreate if the process is
        // killed and restarted.
        savedInstanceState.putInt("POINT_VALUE", pointValue);
        savedInstanceState.putInt("ROLL_TOTAL", rollTotal);
        savedInstanceState.putInt("WINS_COUNTER", winsCounter);
        savedInstanceState.putInt("LOSE_COUNTER", loseCounter);
        savedInstanceState.putInt("DIE_1", d1);
        savedInstanceState.putInt("DIE_2", d2);
    } // end onSavedInstanceState

这是我的 onRestoreInstanceState():

@Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);

        // Restore UI state from the savedInstanceState.
        // This bundle has also been passed to onCreate.
        pointValue = savedInstanceState.getInt("POINT_VALUE");
        rollTotal = savedInstanceState.getInt("ROLL_TOTAL");
        winsCounter = savedInstanceState.getInt("WINS_COUNTER");
        loseCounter = savedInstanceState.getInt("LOSE_COUNTER");
        d1 =  savedInstanceState.getInt("DIE_1");
        d2 =  savedInstanceState.getInt("DIE_2");

        roll.setText(String.valueOf(rollTotal));
        point.setText(String.valueOf(pointValue));
        winTotal.setText(String.valueOf(winsCounter));
        lostTotal.setText(String.valueOf(loseCounter));

        if(d1 == 1) {
            dice1Image.setImageResource(R.drawable.die1);
        }
        else if(d1 == 2) {
            dice1Image.setImageResource(R.drawable.die2);
        }
        else if(d1 == 3) {
            dice1Image.setImageResource(R.drawable.die3);
        }
        else if(d1 == 4) {
            dice1Image.setImageResource(R.drawable.die4);
        }
        else if(d1 == 5) {
            dice1Image.setImageResource(R.drawable.die5);
        }
        else if(d1 == 6) {
            dice1Image.setImageResource(R.drawable.die6);
        }

        if(d2 == 1) {
            dice2Image.setImageResource(R.drawable.die1);
        }
        else if(d2 == 2) {
            dice2Image.setImageResource(R.drawable.die2);
        }
        else if(d2 == 3) {
            dice2Image.setImageResource(R.drawable.die3);
        }
        else if(d2 == 4) {
            dice2Image.setImageResource(R.drawable.die4);
        }
        else if(d2 == 5) {
            dice2Image.setImageResource(R.drawable.die5);
        }
        else if(d2 == 6) {
            dice2Image.setImageResource(R.drawable.die6);
        }
    } // end onRestoreInstanceState method

这解决了当屏幕旋转时图像恢复为默认图像的问题,方法是为每个可绘制图像重新分配一个值,然后使用保存的骰子值来确定应显示哪个图像。不确定这是否是最佳解决方案,但它解决了我的问题。