的onSaveInstanceState实施和定制其旋转屏幕后保存文本后,应用程序崩溃

问题描述 投票:0回答:3

我做的应用程序,显示你的随机数选择最小和最大次数后。但是旋转的结果后消失了,所以我的onSaveInstanceState实施和定制的为我的需要,在那之后我的应用程序崩溃,所有的时间。

公共类MainActivity扩展AppCompatActivity {

EditText et_min,et_max;
Button button;
TextView tv_output;

Random r;
int min, max, output;
private static final String STATE_TV_OUTPUT = "tv_output";


@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    String onSave = savedInstanceState.getString("onSave");
}

@Override
protected void onSaveInstanceState(Bundle SavedInstanceState) {
    super.onSaveInstanceState(SavedInstanceState);
    SavedInstanceState.putString("onSave", "1");
}

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

    r = new Random();
    String onSave = tv_output.getText().toString();
    et_max = (EditText) findViewById(R.id.et_max);
    et_min = (EditText) findViewById(R.id.et_min);
    button = (Button) findViewById(R.id.button);
    tv_output = (TextView) findViewById(R.id.tv_output);

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String tempMin, tempMax;
            tempMin = et_min.getText().toString();
            tempMax = et_max.getText().toString();
            if (!tempMin.equals("") && !tempMax.equals(""))//ovde stavljam ih u poziciju gde su slobodni za pisanje
                min = Integer.parseInt(tempMin);
                max = Integer.parseInt(tempMax);//ova dva sluze kako bi pretvorili stringove u intove za potrebe dole methoda
            if (max > min) {
                output = r.nextInt((max - min) + 1) + min;//nextInt sluzi kako bi dao random broj izmedju dva broja u ovom slucaju min i max
                tv_output.setText("" + output);
            }
        }

    });
}

}

java android
3个回答
1
投票

您需要更改顺序,否则改变束不会通过:

@Override
protected void onSaveInstanceState(Bundle savedInstanceState) {
    savedInstanceState.putString("onSave", "1");
    super.onSaveInstanceState(savedInstanceState);
}

在调用super类的方法并不总是最上面的一个。


1
投票

什么是logcat的输出?

您可以在此处详细了解Android的活动周期:https://developer.android.com/guide/components/activities/activity-lifecycle#java

您的代码保存和恢复状态将是这样的:

static final String STATE_KEY = "onSave";

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    String onSave = savedInstanceState.getString(STATE_KEY);
}

@Override
protected void onSaveInstanceState(Bundle SavedInstanceState) {
    SavedInstanceState.putString(STATE_KEY, "1");
    super.onSaveInstanceState(SavedInstanceState);//call this at the end
}

0
投票

把这一行

String onSave = tv_output.getText().toString();

tv_output初始化后,否则你将得到NullPointerException异常。

更新:

要保存的TextView文本旋转过程中,添加android:freezesText="true"到XML(What is (s/g)etFreezesText in TextView?),没有必要使用的onSaveInstanceState。

© www.soinside.com 2019 - 2024. All rights reserved.