Android开发:从Screen2返回Screen1时保留EditText输入值
解决从Screen2返回Screen1时保留EditText输入内容的问题
我来帮你搞定这个问题哈~先说说原代码里的核心问题:你在Screen2点击返回按钮时,用startActivity重新启动了MainActivity,这会创建一个全新的Activity实例,之前输入的内容自然就没了;另外Screen1里onClick方法里的savedInstanceState.putString是错误用法,savedInstanceState是系统在Activity即将被销毁时才会传入的Bundle,这里直接调用会触发空指针异常哦。
下面是修改后的完整方案:
1. 修改Screen1(MainActivity)代码
我们要通过onSaveInstanceState保存EditText的内容,确保即使Activity被系统回收,返回时也能恢复数据;同时移除错误的savedInstanceState调用:
package com.example.abids.savingdataonbackbutton; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.EditText; public class MainActivity extends AppCompatActivity { Button button; EditText name; private static final String KEY_INPUT_TEXT = "input_text"; @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = findViewById(R.id.buttonNext1); name = findViewById(R.id.editTextName); // 恢复之前保存的输入内容 if (savedInstanceState != null) { String savedText = savedInstanceState.getString(KEY_INPUT_TEXT); name.setText(savedText); } button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String namevalue = name.getText().toString(); Intent intent = new Intent(MainActivity.this, Main3Activity.class); intent.putExtra("Name", namevalue); startActivity(intent); } }); } // 保存EditText内容,防止Activity被系统回收时丢失数据 @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString(KEY_INPUT_TEXT, name.getText().toString()); } }
2. 修改Screen2(Main3Activity)代码
这里的关键是不要重新启动MainActivity,直接调用finish()关闭当前Activity,这样会回到栈中原来的MainActivity实例,输入内容自然就保留了:
package com.example.abids.savingdataonbackbutton; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class Main3Activity extends AppCompatActivity { TextView t1; Button b1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main3); b1 = findViewById(R.id.button); t1 = findViewById(R.id.textView2); String receivedName = getIntent().getStringExtra("Name"); t1.setText("Name :" + receivedName); b1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 直接关闭当前Activity,回到上一个MainActivity实例 finish(); } }); } }
为什么这样修改有效?
- 用
finish()返回:Android的Activity栈会自动管理,关闭Screen2后,栈顶的MainActivity会回到前台,这是原来的实例,EditText的内容本来就存在(除非Activity被系统回收)。 onSaveInstanceState:当Activity因为系统内存不足被回收时,这个方法会保存我们需要的数据,下次创建时可以从savedInstanceState中恢复,确保数据不丢失。
内容的提问来源于stack exchange,提问作者Abid SHAHRUKH ZAMAN
相关产品推荐
相关产品推荐

