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().xml で必要な xml レイアウトを呼び出していない可能性がありますMainActivity

your_layout が ImageViews を含む xml ファイルである場所を呼び出す必要がありsetContentView(R.layout.your_layout)ます。MainActivity

または、それができない場合 (たとえば、 で別のレイアウトを使用する必要があるため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を Field として持つ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.

}
于 2012-10-02T07:27:54.480 に答える
0

この他のクラスをトップレベル クラスから MainActivity のメンバー クラスに移動することで問題を解決しました。この配置により、他のクラスから findviewbyid にアクセスできます。

于 2012-10-02T13:21:08.910 に答える