Search code examples
c#xamarin.android

My Resources.GetIdentifier() in Xamarin doesn't work


I have this code (I'm useing Visual Studio + Xamarin Android):

KeyMechanism.cs:

using Android.App;
using Android.Content;
using Android.Media;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace myApp
{
    class KeyMechanism : Activity
    {
        private string elementId;
        public KeyMechanism(string elementId)
        {
            this.elementId = elementId;
        }

        public void ClickHander()
        {
            int foo = Resources.GetIdentifier(elementId, "id", PackageName);
            var myKey = FindViewById( foo );

            myKey.Touch += (s, e) =>
            {
                //Do something
            };
        }
    }
}

myViewAct.cs:

using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace myApp
{
    public class myViewAct : Activity 
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.myView1);

            int testFoo = Resources.GetIdentifier("button1", "id", PackageName);

            KeyMechanism myKey1 = new KeyMechanism("button1");
            myKey1.ClickHander();

            /*...*/
        }
    }
}

During compilation there is an error:

Java.Lang.NullPointerException: 'Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference'

in file "KeyMechanism.cs" in line with int foo = Resources.GetIdentifier(elementId, "id", PackageName);

I want to catch the view element not using Resourece.Id.myId but using a variable. I don't know what's wrong with my code.


Solution

  • I was able to reproduce this error.

    Java.Lang.NullPointerException: 'Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference'
    

    The error means that your method is used on a NULL object. Please check the code below.

     public class Activity5 : Activity
    {
        Activity mActivity;
        Context context;
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
    
            // Create your application here
    
            SetContentView(Resource.Layout.layout5);
            int testFoo = Resources.GetIdentifier("button1", "id", PackageName);
            mActivity = this;
            context = Android.App.Application.Context;
    
            KeyMechanism myKey1 = new KeyMechanism("button1", mActivity, context);
            myKey1.ClickHander();
    
        }
    }
    class KeyMechanism : Activity
    {
        private string elementId;
        private Activity mActivity;
        private Context context;
        public KeyMechanism(string elementId, Activity mActivity, Context context)
        {
            this.elementId = elementId;
            this.mActivity = mActivity;
            this.context = context;
        }
    
        public void ClickHander()
        {
            int foo = mActivity.Resources.GetIdentifier(elementId, "id", context.PackageName);
    
            var myKey = mActivity.FindViewById(foo);
    
            myKey.Touch += (s, e) =>
            {
                //Do something
                Console.WriteLine("-----------------");
            };
        }
    }