低内存设备中startActivityForResult后Activity销毁致TextView不显示日期问题
解决方案:低内存设备Activity重建后TextView不显示日期问题
看起来你遇到了个典型的Android低内存场景问题——启动相机后Activity被系统销毁,返回重建后明明日志显示设置了日期,但屏幕上就是看不到。我来帮你拆解可能的原因和对应的解决办法:
1. 先确认布局是否正确加载到Activity
你的代码里用了自定义的loadContent()方法来加载布局,但如果这个方法内部没有正确调用setContentView()把布局绑定到当前Activity,即使你通过findViewById拿到了TextView的引用,设置文本也不会显示在屏幕上。
建议替换成Android标准的布局加载方式试试:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("TAG", "onCreate: " + this); // 替换自定义的loadContent为系统的setContentView setContentView(R.layout.activity_invoice_more_options); dateView = findViewById(R.id.date_view); buttonView = findViewById(R.id.button_view); // 后续代码保持不变 dateView.setText(Tools.getFormattedDate(Calendar.getInstance().getTime(), "dd MM yyyy")); buttonView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent chooseImageIntent = getPickImageIntent(getApplicationContext(), getString(R.string.choose_action)); startActivityForResult(chooseImageIntent, FILE_PICKER_RESULT); } }); }
2. 保存并恢复Activity状态(如果需要保留启动前的日期)
如果你的需求是返回后显示启动相机之前的日期(而不是重建时的当前日期),那必须在Activity被系统销毁前保存这个日期,重建时再恢复:
// 重写onSaveInstanceState,保存当前日期 @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); // 把TextView当前的文本保存到Bundle里 outState.putString("saved_display_date", dateView.getText().toString()); } // 在onCreate中恢复状态 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_invoice_more_options); dateView = findViewById(R.id.date_view); buttonView = findViewById(R.id.button_view); String displayDate; if (savedInstanceState != null) { // 如果有保存的状态,取出之前的日期 displayDate = savedInstanceState.getString("saved_display_date"); } else { // 首次创建时,获取当前日期 displayDate = Tools.getFormattedDate(Calendar.getInstance().getTime(), "dd MM yyyy"); } dateView.setText(displayDate); // 按钮点击监听代码不变 }
3. 排查生命周期方法是否意外修改了TextView
虽然你的onActivityResult代码没操作dateView,但可以加个日志确认这段逻辑执行后TextView的状态:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Log.d("TAG", "onActivityResult: 当前dateView文本 = " + dateView.getText().toString()); if (data == null) return; switch (requestCode) { case FILE_PICKER_RESULT: if (resultCode != RESULT_OK) return; final String fileName = Tools.getFileName(this, data); String fileContent = Tools.getFileContent(this, data); break; } }
如果这里日志显示文本变成了空,说明有其他隐藏的代码在修改它,需要进一步排查。
4. 检查TextView的基础属性配置
最后,可以去布局文件里确认date_view的两个关键属性:
android:visibility是否设置为visible(不是gone或invisible)- 文本颜色
android:textColor是否和背景色接近,导致肉眼看不见
另外,从你的日志来看,Activity被多次销毁重建(两次onCreate),这是低内存设备上的正常现象,用状态保存的方式可以确保无论重建多少次,日期都能正确显示。
内容的提问来源于stack exchange,提问作者Slel
相关产品推荐
相关产品推荐

