2013-02-22 4 views
4

Я пытаюсь создать динамически ImageView, и я хочу передать это изображениеView как параметр метода в слушатель.переменная non-final внутри внутреннего класса

  ImageView imageView1 = new ImageView(LookActivity.this); 

      imageView1.setOnTouchListener(new OnTouchListener() { 

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

Но я везу следующее сообщение об ошибке:
не может относиться к неконечной переменной imageView1 внутри внутреннего класса, определенный в другом методе.

Я не хочу объявлять изображениеView как окончательное. Как я могу решить эту проблему?

+0

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

ответ

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

+0

@EmanuelMoecklin: +1 !! Отличный ответ! : D – Swayam

2

Создайте ImageView imageView1 как глобальную переменную класса.

И инициализируйте его внутри функции, как вы делаете, не объявляя ее снова.

Что-то вроде

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

} 
+1

Вы бьете я к примеру, да, вот как это должно быть сделано – codeMagic

+1

@codeMagic: Ха-ха. Я яростно печатал! : D – Swayam

2

Не задайте метод ImageView. Сделайте его переменной-членом, объявленной под вашим определением класса.

4

Поскольку это Android, arg0 будет вашим изображением, когда вы его коснетесь. Использование:

detectLocationAndShowPopUp((ImageView) arg0); 
+2

Добро пожаловать в StackOverflow! Я немного улучшил ваш ответ, добавив образец кода и используя инструменты разметки. Я также дал вам взнос, так как этот ответ правильный. Вы можете улучшить свой ответ с помощью некоторых советов в [ask], нажав «[edit]». – Sam

+1

большое спасибо, я улучшу свой опыт со временем – Firstborn

+0

Упс! Я хотел бы [ответить] ... :) – Sam

2

Вы используете анонимный класс, а не внутренний класс (например, название говорит). В анонимных классах вы можете ссылаться только на «переменные» final.

Если вы не хотите, чтобы добавить final к imageView и не хотите использовать другую конечную переменную, которую вы можете использовать внутренний класс:

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

Идея два: Используйте анонимный подкласс 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; 
    } 
}}; 
Смежные вопросы