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

低内存设备中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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:05:19