Xamarin Android中Fragment调用Assets报错:当前上下文不存在‘assets’
解决Fragment中访问Assets报错的问题
这个问题我之前碰到过好多次,核心原因很简单:Fragment本身并没有直接提供Assets属性,你直接写Assets自然会提示“当前上下文不存在该名称”。得通过Fragment关联的Activity来访问Assets资源才行。
修复步骤
1. 替换Assets的引用方式
把你原来代码里的Assets改成Activity.Assets,因为Fragment的Activity属性会返回它所依附的Activity实例,而Activity是自带Assets属性的。
2. 选对生命周期方法执行代码
建议把设置字体的代码放在Fragment的OnViewCreated或者OnActivityCreated方法里,这两个阶段Fragment已经和Activity完成绑定,Activity属性不会为空。
修复后的完整示例代码:
public class xFragment : Fragment { const string ARG_PAGE = "ARG_PAGE"; private int mPage; public static xFragment newInstance(int page) { var fragment = new xFragment(); var args = new Bundle(); args.PutInt(ARG_PAGE, page); fragment.Arguments = args; return fragment; } public override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); mPage = Arguments.GetInt(ARG_PAGE); } public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.Inflate(Resource.Layout.your_fragment_layout, container, false); } public override void OnViewCreated(View view, Bundle savedInstanceState) { base.OnViewCreated(view, savedInstanceState); // 设置字体的核心代码 var tv1 = view.FindViewById<TextView>(Resource.Id.tv1); if (tv1 != null && Activity != null) { tv1.Typeface = Typeface.CreateFromAsset(Activity.Assets, "fonts/Montserrat_Light.ttf"); } } }
额外注意事项
- 确保字体文件路径正确:
fonts/Montserrat_Light.ttf意味着Assets目录下有个fonts文件夹,里面放着这个ttf文件,并且文件的Build Action要设置为AndroidAsset(右键文件→属性里可以修改)。 - 一定要加
Activity != null的判断,避免Fragment在未绑定Activity时调用导致空引用异常。 - 别在Fragment的构造函数或者
OnCreate方法里直接用Activity,这时候Activity可能还没完成绑定,容易出问题。
内容的提问来源于stack exchange,提问作者Konstantinos Evangelidis
相关产品推荐
相关产品推荐

