在我的MainActivity类中,我有这个方法:
MainActivity.java
public void ClearImageViews() {
final ImageView image_a = (ImageView)findViewById(R.id.image_a);
image_a.setVisibility(View.INVISIBLE);
}
在另一个文件中,我有另一个类,它调用ClearImageViews方法:
MainActivity mainActivity = new MainActivity();
mainActivity.ClearImageViews();
我在运行findViewById函数的代码时得到NullPointerExpection。当我注释掉这些内容时:
final ImageView image_a = (ImageView)findViewById(R.id.image_a);
image_a.setVisibility(View.INVISIBLE);
代码效果很好。我究竟做错了什么?
答案 0 :(得分:2)
您可能没有在setContentView()
中为所需的xml布局调用MainActivity
。
您需要在setContentView(R.layout.your_layout)
中调用MainActivity
,其中your_layout是您拥有ImageView的xml文件。
或者如果你不能这样做(因为你需要在MainActivity
中使用另一个布局),你必须给你的ImageView充气。阅读有关膨胀视图的信息。
答案 1 :(得分:1)
通过执行MainActivity mainActivity = new MainActivity();
您正在创建新的活动实例。这与正在运行的活动不同。
对于您创建的新的onCreate
未调用,因此未设置内容,findViewById返回null ...
您需要使用回调函数以适当的方式调用ClearImageViews()
..
另一个解决方案是使方法ClearImageViews()
保持静态,然后使用:
MainActivity.ClearImageViews()
答案 2 :(得分:1)
将Activity
作为其ImageView
字段的Context
传递给另一个类。
现在使用这样的东西......
class AnotherClass extends Activity{
OriginalClass o;
public AnotherClass(OriginalClass oo){
this.o = oo;
}
final ImageView image_a = (ImageView)this.o.findViewById(R.id.image_a);
// Use this.o.findViewById like above.
}
答案 3 :(得分:0)
我通过将其他类从顶级类移动到MainActivity的成员类来解决了我的问题。通过这种安排,我可以从其他班级访问findviewbyid。