2013-02-22 45 views
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。我怎樣才能克服這個問題?

+0

http://stackoverflow.com/questions/1299837/cannot-refer-to-a-non-final-variable-inside-an-inner-class-defined-in-a-differen – Nermeen 2013-02-22 16:01:11

回答

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; 
    } 
}); 
+2

這是一個很好的一般答案。但對於那些不瞭解Android的人來說,'arg0'是'imageView1'的引用,如果需要的話,簡單地將它轉換爲ImageView。 – Sam 2013-02-22 16:08:52

+0

@EmanuelMoecklin:+1!確實很好的答案! :D – Swayam 2013-02-22 16:22:56

2

創建ImageView imageView1作爲全局類變量。

然後在函數內初始化它,而不是再次聲明它。

喜歡的東西

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

} 
+1

你打我舉例來說,是的,這是應該怎麼做 – codeMagic 2013-02-22 16:03:46

+1

@codeMagic:哈哈。我正在瘋狂地打字! :D – Swayam 2013-02-22 16:04:44

2

不要在方法中定義ImageView。使其成爲在您的類定義下聲明的成員變量

4

由於這是Android,因此觸摸它時將會是您的圖片。使用:

detectLocationAndShowPopUp((ImageView) arg0); 
+2

歡迎來到StackOverflow!我通過添加代碼示例並使用標記工具來改進您的答案。因爲這個答案是正確的,所以我也給了你一個贊成票。您可以通過點擊「[編輯]」的[請求]中的某些建議來再次改進您的答案。 – Sam 2013-02-22 16:19:52

+1

非常感謝,我會提高我的經驗與時間 – Firstborn 2013-02-22 16:43:31

+0

哎呀!我的意思是喜歡[回答] ... :) – Sam 2013-02-22 17:46:02

2

您使用的是匿名類而不是內部類(如標題所示)。在匿名類中,您只能引用final「變量」。

如果你不希望添加到finalimageView不想使用另一個決賽變量,你可以使用一個內部類:

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; 
    } 
    } 
} 
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; 
    } 
}}; 
相關問題