user971741
user971741

Reputation:

NullPointerException over accessing resource when calling the method from extended class

I have an activity class ClassA extended from ListActivity which has few function that manipulate the UI.

I have another class ClassB extended from ClassA which handles map related logics. The ClassB calls a function updateNearByNames of ClassA.

But when the function reaches the line where it needs to access a UI resource findViewById(R.id.namesAround); it throws a NullPointerException.

The UI resource exists and the function works fine if called from within ClassA.

08-09 22:43:22.705: E/AndroidRuntime(5593): FATAL EXCEPTION: main
08-09 22:43:22.705: E/AndroidRuntime(5593): java.lang.NullPointerException
08-09 22:43:22.705: E/AndroidRuntime(5593):     at android.app.Activity.findViewById(Activity.java:1839)

Code:

public class ClassA extends ListActivity {

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        setContentView(R.layout.main_v);
        ...

    }
    public void updateNearByNames() {
        Spinner reportEventNamesAroundSpinner = (Spinner) findViewById(R.id.namesAround); // Error Here
        ...
        ...
    }
}


public class ClassB extends ClassA implements GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener, OnItemSelectedListener {
    ...    
    @Override
    public void onConnected(Bundle connectionHint) {
            updateNearByNames();
    }
}

Upvotes: 0

Views: 59

Answers (1)

Droidman
Droidman

Reputation: 11608

it won't work this way. You can't access the Views of an Activity by just subclassing it, you will always get an NPE. What you need to do is adding a constructor to your second class and pass an instance of your Activity.

  public ClassB(ClassA a){
   this.a = a;
   //a is a class field
  }

later in some method of ClassB:

  a.yourMethodInClassAThatAccessesViews();

Instantiating ClassB from ClassA:

 ClassB b = new ClassB(this);

Another option is adding a public initializer to ClassB:

   public void initContext(ClassA a){
      this.a = a;
   }

Upvotes: 0

Related Questions