保存Android活动状态

时间:2018-11-13 08:33:46

标签: java android

我刚刚学习了Android编程,但是遇到了问题。

我使用通过编程方式添加的复选框小部件创建活动,或者如果用户触摸添加按钮(tambah),则将添加复选框小部件,问题是如何保存状态活动?

MainActivity.java

public class MainActivity extends Activity {

// Variable Global
int checkId = 0; //CheckBox Id
EditText ex;
TextView noText;
LinearLayout m;
CheckBox check;
CheckBox noCheck;
String dat;
Toast errorNot;

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

public void funcOne(View view) {

    /**
     * tambah.onClick function
     * @param ex - EditText variable
     * @param noText - TextView variable used for spacing
     * @param m - CheckBox main layout
     * @param check - Generated CheckBox widget
     * @param noCheck - Toggle between CheckBox and EditText
     * @param dat - EditText variable converted to String
     * @param errorNot - To display noData error
     */

    ex = (EditText)findViewById(R.id.editData);
    noText = new TextView(this);
    m = (LinearLayout)findViewById(R.id.checkBoxLayout);
    check = new CheckBox(this);
    noCheck = (CheckBox)findViewById(R.id.noCheck);
    dat = ex.getText().toString();
    errorNot = Toast.makeText(this, "No input data", Toast.LENGTH_LONG);

    // Method
    if (dat.length() > 1) {
        if (noCheck.isChecked()) {
            noText.setText(dat);
            m.addView(noText);
        } else {

            /**
             * @param n - New Toast (Only for debugging)
             */

            checkId ++;
            Toast n = Toast.makeText(this, Integer.toString(checkId), Toast.LENGTH_SHORT);
            check.setTag("ch"+checkId);
            check.setText(dat + " <WidgetTag " +check.getTag() + ">");
            m.addView(check);
            n.show();
        }
    } else {
        errorNot.show();
    }
}

public void addSpace(View view) {

    /**
     * space.onClick function
     * @param b - Child layout
     * @param d - TextView
     */

    LinearLayout b = (LinearLayout)findViewById(R.id.checkBoxLayout);
    TextView d = new TextView(this);
    b.addView(d);
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    //outState.putBoolean("AstringKey", noCheck);
    outState.putString("AStringKey2", dat);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    //savedInstanceState.getBoolean("AStringKey");
    savedInstanceState.getString("AStringKey2");
}

应用布局: http://imgur.com/gallery/1ZfJ5QL

2 个答案:

答案 0 :(得分:1)

每个活动中都有一个onCreate()方法的Bundle参数。您可以在其中保存实例。您可以在onPause()中编写代码,以便在完成活动之前它将存储您的内容。您可以使用相同的捆绑包再次访问它

答案 1 :(得分:0)

有2种方法可以帮助您实现这一目标。

    @Override
            public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
                super.onSaveInstanceState(outState, outPersistentState);
// save your data into either or both of the parameters with the put### methods
            }

此方法允许您的活动即使在重新启动后仍保留其一些数据。重新启动后要保留的数据可以存储在PersistableBundle对象中。 Bundle对象的用法与以下对象相同。 但是,此方法需要在启动此活动时设置一些属性,您可以在android sdk文档中阅读更多内容。

     @Override
        protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
// save your data into either or both of the parameters with the put### methods
        }

此方法仅允许您的活动保留一些数据,但是重新启动后将清除所有数据。您可以将所有必要的数据存储在Bundle对象中。前提是您没有销毁活动实例,那么下次您返回此活动时,此捆绑包将被传递到您的onCreate方法中。

但是代码中的错误是这样;

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    //savedInstanceState.getBoolean("AStringKey");
    savedInstanceState.getString("AStringKey2");// you are not assigning this to the dat variable.
// it should rather be
dat = savedInstanceState.getString("AStringKey2");
}