活动中oncreate和onRestoreInstanceState方法之间的区别

时间:2014-07-25 07:52:24

标签: android android-activity

伙计我遇到了这两种方法的问题: -

当我更改设备的方向并在从包中检索文本后在编辑文本中设置文本时,它不起作用。但是相同的代码在onrestoreStoreInstante方法中工作。

请查看我的代码: -

public class LifeCycleActivity extends Activity implements OnClickListener {
/** Called when the activity is first created. */

EditText user;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    user=(EditText)findViewById(R.id.et_user);

    if(savedInstanceState!=null){

        String s =savedInstanceState.get("Key").toString();
        user=(EditText)findViewById(R.id.et_user);
        user.setText(savedInstanceState.get("Key").toString());         

        Toast.makeText(this, s,Toast.LENGTH_SHORT).show();

    }

    Toast.makeText(this, "onCreate",Toast.LENGTH_SHORT).show();
    Button b=(Button)findViewById(R.id.button1);
    b.setOnClickListener(this);

}


@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

     Toast.makeText(this, "onSaveInstanceState",Toast.LENGTH_SHORT).show();
        outState.putString("Key", "Deepak");
}

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

    //String s =savedInstanceState.get("Key").toString();
    //user.setText(s);
     Toast.makeText(this, "onRestoreInstanceState",Toast.LENGTH_SHORT).show();

}

@Override
protected void onStart() {
    // TODO Auto-generated method stub
    super.onStart();
    Toast.makeText(this, "onStart",Toast.LENGTH_SHORT).show();
}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    Toast.makeText(this, "onResume",Toast.LENGTH_SHORT).show();
}

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    Toast.makeText(this, "onPause",Toast.LENGTH_SHORT).show();
}

@Override
protected void onStop() {
    // TODO Auto-generated method stub
    super.onStop();
    Toast.makeText(this, "onStop",Toast.LENGTH_SHORT).show();
}


@Override
protected void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
      Toast.makeText(this, "onDEstroy",Toast.LENGTH_SHORT).show();
}


@Override
protected void onRestart() {
    // TODO Auto-generated method stub
    super.onRestart();
    Toast.makeText(this, "onRestart",Toast.LENGTH_SHORT).show();
}

@Override
public void onClick(View arg0) {
    // TODO Auto-generated method stub
     startActivity(new Intent(LifeCycleActivity.this,SecondActivity.class));
}

}

当我从Bundle获取值后在oncreate方法中设置编辑文本中的文本时,它不起作用。但是相同的代码在onRestoreInstanceState()方法中有效。

根据我的说法,它也适用于oncreate,因为我们可以在那里获得Bundle类对象。 请帮我解决这个问题..

2 个答案:

答案 0 :(得分:2)

EditText并且大多数其他视图都有自己的方法来保存/恢复自己的数据。因此,一般情况下,没有必要在代码上保存/恢复它们。

你可以在{35}上的Android TextView source code(请记住EditText从TextView扩展)中看到这一点:

if (ss.text != null) {
    setText(ss.text);
}

因此您无法设置onCreate并且可以onRestoreInstanceState这样做的原因是因为在您的活动super.onRestoreInstanceState(savedInstanceState)期间,活动会调用EditText.onRestoreInstanceState并且EditText将其自身恢复为之前的值。

你可以在第940行的Activity source code上看到它发生了

protected void onRestoreInstanceState(Bundle savedInstanceState) {
    if (mWindow != null) {
        Bundle windowState = savedInstanceState.getBundle(WINDOW_HIERARCHY_TAG);
        if (windowState != null) {
            mWindow.restoreHierarchyState(windowState);
        }
    }
}
希望它有所帮助。

答案 1 :(得分:1)

<强>概述

  • onSaveInstanceState()用于将数据绑定到
  • onRestoreInstanceState()用于设置可用的数据 捆绑到您的活动

请按以下步骤操作:

  1. 我猜猜在创建活动之前onorientation改变了 捆绑包不可用,这是你无法检索它的方式 在oncreate
  2. 让活动在oncreate
  3. 中创建
  4. 然后在onRestoreInstanceState
  5. 中恢复实例

    希望这会有所帮助!