Java Android OnCreate输入包始终为空
我正在承担这个项目,但我在活动和保存状态方面遇到了一些问题。因此,我回到了最基本的方面,试图理解我遗漏了什么。然而,即使是一个非常简单的设置,我也有同样的问题 因此,我从一个空项目开始,在activity_main.xml上放置了2个文本视图和1个按钮,在activity_2.xml上放置了1个按钮。用户将在文本框中输入一些文本,按下按钮前进到Activity2活动,然后按下按钮(在Activity2布局中)返回到Main活动 我希望输入到文本框中的文本已被重写的onSaveInstanceState方法保存,然后OnCreate中的bundle参数将保存此值。但是,当点击MainActivity时,尽管按下启动Activity2的按钮时调用了onSaveInstanceState,但捆绑包始终为nullJava Android OnCreate输入包始终为空,java,android,android-activity,android-context,android-savedstate,Java,Android,Android Activity,Android Context,Android Savedstate,我正在承担这个项目,但我在活动和保存状态方面遇到了一些问题。因此,我回到了最基本的方面,试图理解我遗漏了什么。然而,即使是一个非常简单的设置,我也有同样的问题 因此,我从一个空项目开始,在activity_main.xml上放置了2个文本视图和1个按钮,在activity_2.xml上放置了1个按钮。用户将在文本框中输入一些文本,按下按钮前进到Activity2活动,然后按下按钮(在Activity2布局中)返回到Main活动 我希望输入到文本框中的文本已被重写的onSaveInstanceSt
我错过什么了吗?onSaveInstanceState方法肯定已启动,并且其中已填充savedInstanceState,因此,为什么在再次启动MainActivity并调用onCreate时捆绑包savedInstanceState为空?这是我开始其他活动的方式吗 谢谢你的帮助 以下是我的设置,仅供参考: 我的主要活动:
public class MainActivity extends AppCompatActivity {
Button forwardButton;
TextView editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
forwardButton = findViewById(R.id.buttonForward);
editText = findViewById(R.id.editText);
forwardButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Code here executes on main thread after user presses button
Intent activity2 = new Intent(MainActivity.this,Activity2.class);
startActivity(activity2);
}
});
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
String textToSave = editText.getText().toString();
savedInstanceState.putString("editText",textToSave);
super.onSaveInstanceState(savedInstanceState);
}
}``
我的活动2类:
public class Activity2 extends AppCompatActivity {
Button goBack;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_2);
goBack = findViewById(R.id.goBack);
goBack.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Code here executes on main thread after user presses button
Intent activity2 = new Intent(Activity2.this,MainActivity.class);
startActivity(activity2);
}
});
}
}
Activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/buttonForward"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="162dp"
android:layout_marginTop="232dp"
android:layout_marginEnd="162dp"
android:layout_marginBottom="76dp"
android:text="Forward"
app:layout_constraintBottom_toTopOf="@+id/textView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/editText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="96dp"
android:layout_marginTop="43dp"
android:layout_marginEnd="102dp"
android:layout_marginBottom="268dp"
android:ems="10"
android:inputType="textPersonName"
android:text="Enter"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
</androidx.constraintlayout.widget.ConstraintLayout>
activity_2.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Activity2">
<Button
android:id="@+id/goBack"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="162dp"
android:layout_marginTop="232dp"
android:layout_marginEnd="162dp"
android:layout_marginBottom="76dp"
android:text="Go back"
app:layout_constraintBottom_toTopOf="@+id/textView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
在您的活动中2
goBack.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Activity2.this.finish();
}
});
//this will trigger when the same instance of activity is restored
//by the back press that finishes the Activity2
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
String data = savedInstanceState.getString("editText");
}
并在MainActivity
中从onRestoreInstanceState
goBack.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Activity2.this.finish();
}
});
//this will trigger when the same instance of activity is restored
//by the back press that finishes the Activity2
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
String data = savedInstanceState.getString("editText");
}
在您的活动中2
goBack.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Activity2.this.finish();
}
});
//this will trigger when the same instance of activity is restored
//by the back press that finishes the Activity2
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
String data = savedInstanceState.getString("editText");
}
并在MainActivity
中从onRestoreInstanceState
goBack.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Activity2.this.finish();
}
});
//this will trigger when the same instance of activity is restored
//by the back press that finishes the Activity2
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
String data = savedInstanceState.getString("editText");
}
“那么,为什么在再次启动MainActivity并调用onCreate时捆绑包savedInstanceState为空?”——因为它是一个完全不同的活动实例。除了属于同一类之外,它与原始实例完全无关,因为您启动了第二个实例。如果您想让Activity2
返回到现有的MainActivity
实例,请在onClick()
方法中调用finish()
,而不是startActivity()
@commonware好的,谢谢-这很有意义。假设我想添加第三个活动,当完成后返回到第二个活动,finish()方法如何知道要返回到哪个活动?它是活动开始的地方吗?其次,假设应用程序是从头开始加载的,它需要上一个会话的数据-我是否需要在onDestroy()上序列化上一个会话的数据,然后在MainActivity中的第一个onCreate上重新加载?另外,这是否意味着onCreate和input bundle参数在活动更改之间根本不被调用或使用?i、 e.它们仅在方向发生变化或应用程序从零开始完全重新启动且需要从存储中加载数据时使用?在后一种情况下,输入包参数仍然为null正确?“finish()方法如何知道然后返回到哪个活动-是活动启动的那个活动吗?”--控件返回到后堆栈上它前面的任何活动。“我是否需要在onDestroy()上序列化上一个会话中的数据,然后在MainActivity中的第一个onCreate上重新加载?”--您需要将数据保存到某个地方。通常,当数据发生更改时,您会这样做,因为不能保证调用onDestroy()
。“它们仅在发生方向更改之类的事情时使用”——这是主要场景。有关更多信息,请参阅和Android应用程序开发书籍。“那么,当再次启动MainActivity并调用onCreate时,捆绑包savedInstanceState是否为空?”——因为它是一个完全不同的活动实例。除了属于同一类之外,它与原始实例完全无关,因为您启动了第二个实例。如果您想让Activity2
返回到现有的MainActivity
实例,请在onClick()
方法中调用finish()
,而不是startActivity()
@commonware好的,谢谢-这很有意义。假设我想添加第三个活动,当完成后返回到第二个活动,finish()方法如何知道要返回到哪个活动?它是活动开始的地方吗?其次,假设应用程序是从头开始加载的,它需要上一个会话的数据-我是否需要在onDestroy()上序列化上一个会话的数据,然后在MainActivity中的第一个onCreate上重新加载?另外,这是否意味着onCreate和input bundle参数在活动更改之间根本不被调用或使用?i、 e.它们仅在方向发生变化或应用程序从零开始完全重新启动且需要从存储中加载数据时使用?在后一种情况下,输入包参数仍然为null正确?“finish()方法如何知道然后返回到哪个活动-是活动启动的那个活动吗?”--控件返回到后堆栈上它前面的任何活动。“我是否需要在onDestroy()上序列化上一个会话中的数据,然后在MainActivity中的第一个onCreate上重新加载?”--您需要将数据保存到某个地方。通常,当数据发生更改时,您会这样做,因为不能保证调用onDestroy()
。“它们仅在发生方向更改之类的事情时使用”——这是主要场景。有关更多信息,请参阅和Android应用程序开发书籍。好的,这是因为保存在onSavedInstanceState中的数据似乎在Activity2.this.finish()之后重新加载回MainActivity;。但是,调试表明,当onRestoreInstanceState被调用时,它不会在MainActivity中被调用