1

在我的 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);

代码运行良好。我究竟做错了什么?

4

4 回答 4

2

您可能没有setContentView()MainActivity.

setContentView(R.layout.your_layout)您需要调用MainActivitywhere your_layout 是一个 xml 文件,其中有您的 ImageViews。

或者如果你做不到(因为例如你需要在 中使用另一个布局MainActivity),你必须膨胀你的 ImageViews。阅读有关膨胀视图的信息。

于 2012-10-02T07:25:52.360 回答
1

通过这样做MainActivity mainActivity = new MainActivity();,您正在创建新的活动实例..这与正在运行的活动不同..
对于您创建的新活动,onCreate不会调用它,因此没有为此设置内容,findViewById 返回 null...
您需要使用回调函数以ClearImageViews()适当的方式调用..

另一种解决方案是将方法设为ClearImageViews()静态,然后使用以下命令调用它:

MainActivity.ClearImageViews()
于 2012-10-02T07:25:57.597 回答
1

ActivitythisImageView作为其字段的 this 作为 aContext传递给另一个类。

现在使用这样的东西......

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.

}
于 2012-10-02T07:27:54.480 回答
0

我解决了我的问题,将这个其他类从顶级类移动到 MainActivity 的成员类。通过这种安排,我可以访问其他班级的 findviewbyid。

于 2012-10-02T13:21:08.910 回答