EditText.setText()无效

本文解释了在Android中遇到的一个常见问题:当屏幕旋转或打开新的活动时,EditText的内容未能更新。文章提供了详细的解决方案,即通过将saveEnabled属性设置为false来避免系统的状态恢复机制覆盖EditText的新值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自:http://blog.youkuaiyun.com/learner_lps/article/details/52316878
感谢原博主。

先说原因:
安卓会自动保存某些view的状态,旋转屏幕或打开一个活动后,onSaveInstanceState会保存了EditText的内容,然后在onCreate的时候把EditText设置成功了,但是随后会在->onRestoreInstanceState尝试恢复之前的值,所以造成了值没改变。saveEnabled设为false就不会恢复这个EditText的值。

所以,mEditText.setSaveEnabled(false); 就可以了。

import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private EditText num1EditText, num2EditText, resultEditText; private RadioGroup operationRadioGroup; private RadioButton addRadioButton, multiplyRadioButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化视图 num1EditText = findViewById(R.id.num1EditText); num2EditText = findViewById(R.id.num2EditText); resultEditText = findViewById(R.id.resultEditText); operationRadioGroup = findViewById(R.id.operationRadioGroup); addRadioButton = findViewById(R.id.addRadioButton); multiplyRadioButton = findViewById(R.id.multiplyRadioButton); // 设置数字按钮点击事件 setNumberButtonClickListeners(); // 设置操作符按钮点击事件 setOperatorButtonClickListeners(); // 设置等号按钮点击事件 Button buttonEquals = findViewById(R.id.buttonEquals); buttonEquals.setOnClickListener(v -> calculate()); // 设置清除按钮点击事件 Button buttonClear = findViewById(R.id.buttonClear); buttonClear.setOnClickListener(v -> clearAll()); } private void setNumberButtonClickListeners() { int[] numberButtonIds = { R.id.button0, R.id.button1, R.id.button2, R.id.button3, R.id.button4, R.id.button5, R.id.button6, R.id.button7, R.id.button8, R.id.button9, R.id.buttonDot }; for (int id : numberButtonIds) { Button button = findViewById(id); button.setOnClickListener(v -> appendToCurrentInput(button.getText().toString())); } } private void setOperatorButtonClickListeners() { int[] operatorButtonIds = { R.id.buttonAdd, R.id.buttonSubtract, R.id.buttonMultiply, R.id.buttonDivide }; for (int id : operatorButtonIds) { Button button = findViewById(id); button.setOnClickListener(v -> { String operator = button.getText().toString(); if (operator.equals("+")) { addRadioButton.setChecked(true); } else if (operator.equals("*")) { multiplyRadioButton.setChecked(true); } }); } } private void appendToCurrentInput(String text) { if (num1EditText.hasFocus()) { num1EditText.append(text); } else if (num2EditText.hasFocus()) { num2EditText.append(text); } else { // 如果没有焦点,默认添加到第一个输入框 num1EditText.append(text); num1EditText.requestFocus(); } } private void calculate() { String num1Str = num1EditText.getText().toString(); String num2Str = num2EditText.getText().toString(); if (num1Str.isEmpty() || num2Str.isEmpty()) { Toast.makeText(this, "请输入两个数字", Toast.LENGTH_SHORT).show(); return; } try { double num1 = Double.parseDouble(num1Str); double num2 = Double.parseDouble(num2Str); double result = 0; if (addRadioButton.isChecked()) { result = num1 + num2; } else if (multiplyRadioButton.isChecked()) { result = num1 * num2; } resultEditText.setText(String.valueOf(result)); } catch (NumberFormatException e) { Toast.makeText(this, "请输入有效的数字", Toast.LENGTH_SHORT).show(); } } private void clearAll() { num1EditText.setText(""); num2EditText.setText(""); resultEditText.setText(""); addRadioButton.setChecked(true); num1EditText.requestFocus(); } }
最新发布
06-01
private fun sendHttpRequest(json:JSONObject) { val urlString = "https://183.191.209.32:18802/app-card/writeCard/sdkDeviceRegist" //val client = OkHttpClient() val client = createUnsafeOkHttpClient() val request = Request.Builder() .url(urlString) .post(json.toString().toRequestBody("application/json".toMediaType())) .build() try { client.newCall(request).execute().use { response -> // 处理响应(需在UI线程更新) if (!response.isSuccessful) throw IOException("Request failed: ${response.code}") //response.body?.use { body -> //val contentType = body.contentType()?.toString() ?: "unknown" //val contentLength = body.contentLength() //println("Received $contentLength bytes ($contentType)") //println(body.string()) //} // 解析代码 val gson = Gson() response.body?.let { responseBody -> try { val result = gson.fromJson(responseBody.charStream(), ApiResponse::class.java) //println("retCode: ${result.retCode}, retDesc: ${result.retDesc}") // 方法1:findViewById(基础方式) val etRetCode = findViewById<EditText>(R.id.editText2) etRetCode.setText( result.retCode) val tvRetDesc = findViewById<TextView>(R.id.label2) tvRetDesc.text = result.retDesc saveDataDirectly(result.retCode) // 方法2:View Binding(推荐) //binding.etRetCode.setText({result.retCode}) // 使用字符串模板 //withContext(Dispatchers.Main) { // 切换主线程 // binding.label2.text = result.retDesc } catch (e: JsonSyntaxException) { // 处理JSON格式错误 } } } } catch (e: IOException) { //println("Network error: ${e.message}") //Toast.makeText(this, "Network error:${e.message}", Toast.LENGTH_SHORT).show() e.message?.toString()?.let { errorMsg -> binding.editText2.apply { text = Editable.Factory.getInstance().newEditable(errorMsg) // 可附加其他属性设置 setSelection(errorMsg.length) // 示例:移动光标到末尾 } } } } 在执行text = Editable.Factory.getInstance().newEditable(errorMsg)时闪退,分析解决方案
03-18
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值