我有一个从 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/