FindViewById<Button>返回Null,添加按钮后调用致应用崩溃求助
嘿,我来帮你搞定这个困扰!在Xamarin.Android里遇到FindViewById返回Null的情况太常见了,咱们一步步拆解可能的原因,以及对应的解决办法:
常见原因及排查方向
布局文件ID不匹配或缺失
先检查你的axml布局文件里,有没有给按钮设置正确的ID:android:id="@+id/fooUIButton"。注意拼写、大小写要和代码里的Resource.Id.fooUIButton完全一致——Xamarin的资源ID是自动生成的,哪怕一个字母错了都找不到控件。调用时机不对
一定要确保是在SetContentView加载完布局之后,再去调用FindViewById。如果你的fooUIButtonHandler方法是在OnCreate里还没执行SetContentView的时候就被调用了,那肯定会返回Null。另外,如果是在Fragment中,要等到OnViewCreated生命周期方法之后,用View.FindViewById来查找控件,而不是直接用Activity的FindViewById。控件处于嵌套布局/动态视图中
如果这个按钮是在Fragment的布局、ListView/RecyclerView的列表项,或者ViewStub这类动态加载的视图里,直接用Activity的FindViewById是找不到的。你得先获取到这个嵌套视图的实例,再调用它的FindViewById方法。比如在Fragment里要写:View.FindViewById<Button>(Resource.Id.fooUIButton)。资源ID生成异常
有时候Xamarin的资源生成工具会抽风,导致Resource.Designer.cs里的ID和布局文件不匹配。这时候可以试试清理项目(Clean Solution),然后重新生成解决方案(Rebuild Solution),让系统重新生成资源ID。
代码优化建议
另外,建议你提前在Activity的OnCreate方法里初始化控件并绑定点击事件,不要每次调用方法都去查找控件——这样既提升性能,又能提前发现控件找不到的问题:
private Button _fooUIButton; protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); // 第一步:加载包含按钮的布局文件 SetContentView(Resource.Layout.YourLayoutFileName); // 第二步:初始化控件,提前做空判断 _fooUIButton = FindViewById<Button>(Resource.Id.fooUIButton); if (_fooUIButton == null) { // 可以打日志提醒自己,避免直接崩溃 Android.Util.Log.Error("UIError", "fooUIButton 未在布局中找到!"); return; } // 第三步:直接绑定点击事件 _fooUIButton.Click += (sender, e) => { if (!CheckOriginalImage()) { return; } Intent intent = new Intent(this, typeof(fooImageDemoActivity)); intent.PutExtra(fooImageDemoActivity.EXTRAS_ARG_IMAGE_FILE_URI, originalImageUri.ToString()); StartActivityForResult(intent, REQUEST_SB_F); // 补全你的请求码即可 }; }
按照上面的步骤排查和优化,应该就能解决Null导致的崩溃问题啦!
内容的提问来源于stack exchange,提问作者Ika

