You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:59:08