java - 从扩展类调用方法时访问资源出现 NullPointerException

标签 java android

我有一个从 ListActivity 扩展而来的 Activity 类 ClassA,它几乎没有操作 UI 的函数。

我有另一个从 ClassA 扩展的类 ClassB ,它处理与 map 相关的逻辑。 ClassB 调用 ClassA 的函数 updateNearByNames

但是当函数到达需要访问 UI 资源的行时 findViewById(R.id.namesAround); 它会抛出 NullPointerException

UI 资源存在,如果从 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)

代码:

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();
    }
}

最佳答案

这样是行不通的。您无法仅通过子类化 Activity 来访问它的 Views,您将始终获得 NPE。您需要做的是将构造函数添加到第二个类并传递 Activity 的实例。

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

稍后在 ClassB 的某些方法中:

  a.yourMethodInClassAThatAccessesViews();

ClassA实例化ClassB:

 ClassB b = new ClassB(this);

另一个选项是将公共(public)初始值设定项添加到 ClassB:

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

关于java - 从扩展类调用方法时访问资源出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25221501/

相关文章:

android - MediaPlayer 在 android ICS 中抛出异常

android - Xamarin Android QR-Image ZXing - 不工作

android - 自定义 View 问题

android - 在 Android 设备上着陆时获取正确的坐标

java - 是否可以使用 jni 增强反射性能?

java - xjc 命令未创建模式中定义的所有类

java - org.apache.http.NoHttpResponseException :localhost:2377 failed to respond

java - 将文件中的值存储到数组中

java - Java 中的 2D vector 旋转

Android ActionBar 选项卡 - ListFragment 问题