Xamarin FindViewById returns null
Solution 1
You are setting Main
as the layout for your activity and then in the following lines of code you are asking to find a button named Back
at runtime which is not part of this layout. This means the following line will return null:
FindViewById<Button>(Resource.Id.BackButton)
Now if you do FindViewById<Button>(Resource.Id.BackButton).Click
, you will definitely get a System.NullReferenceException
.
EDIT:
In view of the comments, here is what you should do to achieve what you are looking for:
Create two different activities (Main1
and Main2
). In Main1
you do:
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
this.SetContentView(Resource.Layout.Main);
this.FindViewById<Button>(Resource.Id.ForwardButton).Click += this.Forward;
}
public void Forward(object sender, EventArgs e)
{
this.StartActivity (typeof(Main2));
}
Then in Main2
, you do:
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
this.SetContentView(Resource.Layout.Main2);
this.FindViewById<Button>(Resource.Id.BackButton).Click += this.Back;
}
public void Back(object sender, EventArgs e)
{
this.StartActivity (typeof(Main));
}
Solution 2
Since it just happened to me and almost drove me up the wall, here is yet another way FindViewById
can return null
and how to fix it. Probably not a mistake a more experienced Android developer is likely to make, but still, it might prevent some frustration for someone like me in the future.
My situation
My control was in the correct view (not a fragment), the ID was assigned correctly, everything used to work just a couple of days ago when I last worked on the project.
After building the project, the very first
FindViewById
call inOnCreate
of my main view suddenly returnednull
when run on a physical deviceIt turns out I had just run some updates through the Android SDK Manager, which introduced a new Android Version (in this case Android 7) to my system, and my device simply did not have that version installed yet.
The solution
- In the properties of my Android project, the "Compile using Android version" drop down was set to "Use Latest Platform", which now was pointing to the newly installed Android 7 -- simply setting it to the version of Android running on my test device (in my case 6) and recompiling fixed the
null
return value.
TL;DR Check that the version of Android you are compiling against is in fact supported by the device you are testing on.
Solution 3
You're getting a NullReferenceException
because this code:
FindViewById<Button>(Resource.Id.BackButton)
returns null
. This may be caused by either:
-
1 - You didn't properly annotate the
Button
with anandroid:id
attribute, like so:<Button ... android:id="@+id/BackButton"/>
--OR--
-
2 - that Button isn't defined on the
Main
layout and therefore it isn't part of the Activity's current view. Therefore theFindViewById()
method can't find it. Your intended approach to switch screens isn't supported on Android.Which leads to a longer explanation about the Correct way to "switch screens" on Android: navigating between simple activities
Try one of these solutions.
user3836246
Updated on June 19, 2022Comments
-
user3836246 almost 2 years
I am trying to make an android app using Xamarin so C#. I made two layouts and in each one of them I made tow buttons to navigate between them.I tried like this:
using System; using Android.App; using Android.OS; using Android.Views; using Android.Widget; namespace Example { [Activity(Label = "Example", MainLauncher = true, Icon = "@drawable/icon")] public class MainActivity : Activity { protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); this.SetContentView(Resource.Layout.Main); this.FindViewById<Button>(Resource.Id.ForwardButton).Click += this.Forward; this.FindViewById<Button>(Resource.Id.BackButton).Click += this.Back; } public void Forward(object sender, EventArgs e) { this.SetContentView(Resource.Layout.Main2); } public void Back(object sender, EventArgs e) { this.SetContentView(Resource.Layout.Main); } } }
But every time when I start the app I get this errror: System.NullReferenceException has been thrown.Object reference not set to an instance of an object. Any advice or better idea?
-
user3836246 over 9 yearsI don't think is one of this. Look here my layouts of Main and Main2: en.textsave.org/2Ipb
-
user3836246 over 9 yearsSo I must initialize the Main2 layout in the MainActivity ?
-
Ahmed Salman Tahir over 9 yearsIn that case, you will get the same exception for the Forward button because then it is not part of the Main2 layout. As HighCore suggested, you need to understand the correct way of navigating between activities.
-
user3836246 over 9 yearsSo I must think to another method to switch the layouts?
-
Federico Berasategui over 9 years+1. Just a clarification: the compiler has nothing to do with this. I suggest you change the wording in your answer to make it more technically correct. It should be the "runtime" or "framework", but not the compiler.
-
Ahmed Salman Tahir over 9 years@HighCore - thank you for pointing that out. I wanted to say runtime but wrote compiler. I stand corrected.
-
Ahmed Salman Tahir over 9 years@user3836246 - I updated my answer and added a simple code example that may help you get started.
-
newbieguy over 6 yearsI think i disagree with number 1, it will return error if it does have a different id name.
Resource.Id
will not recognize it.