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

如何在Java的Fragment ViewModel类中获取资源文件的String和Drawable

ViewModel 访问Android资源文件(Java实现)

ViewModel 不允许直接持有Activity、Fragment级别的Context避免内存泄漏,推荐通过继承AndroidViewModel获取Application级上下文来访问系统资源,以下是具体实现:

1. 自定义ViewModel继承AndroidViewModel

import android.app.Application;
import android.graphics.drawable.Drawable;
import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.core.content.ContextCompat;

public class CustomViewModel extends AndroidViewModel {

    public CustomViewModel(@NonNull Application application) {
        super(application);
    }

    // 传入String资源ID,返回实际文本内容
    public String getResString(int stringResId) {
        return getApplication().getResources().getString(stringResId);
    }

    // 传入Drawable资源ID,返回Drawable实例
    public Drawable getResDrawable(int drawableResId) {
        return ContextCompat.getDrawable(getApplication(), drawableResId);
    }
}

2. Fragment中初始化并调用方法

import androidx.lifecycle.ViewModelProvider;

public class TargetFragment extends Fragment {
    private CustomViewModel customViewModel;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 初始化ViewModel
        customViewModel = new ViewModelProvider(this).get(CustomViewModel.class);
        
        // 调用示例
        String pageTitle = customViewModel.getResString(R.string.page_title);
        Drawable icon = customViewModel.getResDrawable(R.drawable.ic_default_icon);
    }
}

注意事项

  • 仅可使用Application级别的Context传入ViewModel,Activity/Fragment级别的Context会导致配置变更(如屏幕旋转)时出现内存泄漏
  • 如果需要适配多语言、深色模式等随配置变更的资源,建议在配置变更后重新调用资源获取方法,或直接在Fragment/Activity层获取资源后传入ViewModel,保证资源和当前页面配置匹配
  • ContextCompat.getDrawable已经做了Android版本兼容,无需额外适配低版本系统的资源获取逻辑

内容的提问来源于stack exchange,提问作者Max

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 16:18:02