如何在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
相关产品推荐
相关产品推荐

