OsmDroid在Fragment中配置用户代理报Unresolved reference问题咨询
报错根因
Fragment不是Context的子类,本身没有applicationContext属性,也不存在getPreferences()内置方法,直接写这两个调用必然报未解析引用。在Activity里能正常运行,是因为Activity直接继承自ContextWrapper,自带这两个能力。
解决方案
推荐方案:全局初始化(一劳永逸)
OsmDroid的配置是全局生效的,没必要在每个页面单独编写,直接放到自定义Application的onCreate里初始化一次即可,所有页面加载地图都能复用配置:
class MapApp : Application() { override fun onCreate() { super.onCreate() // 此处this即Application自身的Context,可直接使用 org.osmdroid.config.Configuration.getInstance() .load(this, getSharedPreferences("osm_config", Context.MODE_PRIVATE)) } }
写完记得在AndroidManifest.xml的<application>节点添加android:name=".MapApp"配置,否则自定义Application不会生效。
临时方案:在Fragment内编写配置
如果有特殊需求必须写在Fragment里,等Fragment和上下文绑定之后(比如onViewCreated、onResume生命周期),通过requireContext()获取关联的上下文再调用即可:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val context = requireContext() org.osmdroid.config.Configuration.getInstance() .load( context.applicationContext, // 注意:getPreferences()是Activity独有方法,通用场景用getSharedPreferences指定文件名即可 context.getSharedPreferences("osm_prefs", Context.MODE_PRIVATE) ) // 后续地图初始化逻辑 }
如果想完全对齐原来Activity里getPreferences()的存储效果,也可以换成requireActivity().getPreferences(Context.MODE_PRIVATE),效果和在Activity里调用完全一致。
注意点
- 不要在Fragment的
onAttach生命周期之前调用requireContext()/requireActivity(),会触发生命周期状态异常 - 配置只需要加载一次,重复调用不会产生功能问题,但会产生不必要的IO开销
内容的提问来源于stack exchange,提问作者user19109604
相关产品推荐
相关产品推荐

