4

ImageViewを動的に作成しようとしましたが、このimageViewをパラメーターとしてメソッドのリスナーに渡したいと思います。

            ImageView imageView1 = new ImageView(LookActivity.this);

            imageView1.setOnTouchListener(new OnTouchListener() {

                    @Override
                    public boolean onTouch(View arg0, MotionEvent arg1) {
                        detectLocationAndShowPopUp(imageView1);
                        return true;
                    }
                })

しかし、次のエラーが発生しています
。別のメソッドで定義された内部クラス内の非最終変数imageView1を参照できません。

imageViewをfinalとして宣言したくありません。どうすればこの問題を克服できますか?

4

6 に答える 6

9

imageView1のコピーを作成してから、リスナー内でそのコピーを使用できます。

ImageView imageView1 = new ImageView(LookActivity.this);
final ImageView imageView2 = imageView1;

imageView1.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View arg0, MotionEvent arg1) {
        detectLocationAndShowPopUp(imageView2);
        return true;
    }
});

サムのコメントの後、コードを次のように変更します。

ImageView imageView1 = new ImageView(LookActivity.this);

imageView1.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent event) {
        detectLocationAndShowPopUp((ImageView) view);
        return true;
    }
});
于 2013-02-22T16:01:15.687 に答える
4

これはAndroidなので、arg0タッチすると画像になります。使用する:

detectLocationAndShowPopUp((ImageView) arg0);
于 2013-02-22T16:02:08.503 に答える
2

ImageView imageView1グローバルクラス変数として作成します。

そして、それを再度宣言することなく、実行しているように関数内で初期化します。

何かのようなもの

MyClass extends ...
{
....
ImageView imageView1;
.
.
.
.
.
myFucntion()
{
imageView1 = new ImageView(LookActivity.this);
}

}
于 2013-02-22T16:01:09.020 に答える
2

ImageViewメソッドでを定義しないでください。クラス定義で宣言されたメンバー変数にします

于 2013-02-22T16:01:29.407 に答える
2

内部クラスではなく匿名クラスを使用しています(タイトルにあるように)。final匿名クラスでは、 「変数」のみを参照できます。

final追加したくない場合imageViewや別のfinal変数を使用したくない場合は、内部クラスを使用できます。

public class YourActivity extends ... {
  public void yourMethod() {
    ImageView imageView1 = new ImageView(LookActivity.this);
    imageView1.setOnTouchListener(new MyListener(imageView1));
  }

  private class MyListener extends OnTouchListener {
    private ImageView imageView;

    public MyListener(ImageView iv) {
      this.imageView = iv;
    }

    @Override
    public boolean onTouch(View arg0, MotionEvent arg1) {
     detectLocationAndShowPopUp(imageView);
     return true;
    }
  }
}
于 2013-02-22T16:04:35.167 に答える
1

アイデア1:別の最終変数を使用します。

ImageView imageView1 = new ImageView(LookActivity.this);
final ImageView finalImageView = imageView1;
imageView1.setOnTouchListener(new OnTouchListener() {
  @Override
  public boolean onTouch(View arg0, MotionEvent arg1) {
    detectLocationAndShowPopUp(finalImageView);
    return true;
  }
})

アイデア2:ImageViewの匿名サブクラスを使用してから、ImageView.this参照を使用します。

ImageView imageView1 = new ImageView(LookActivity.this) {{
  setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View arg0, MotionEvent arg1) {
      detectLocationAndShowPopUp(ImageView.this);
      return true;
    }
}};
于 2013-02-22T16:04:56.383 に答える