Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Kression
0 / 0 / 0
Регистрация: 06.09.2014
Сообщений: 37
1

Поясните как this передает самого себя в качестве параметра

28.02.2016, 00:38. Просмотров 901. Ответов 4
Метки нет (Все метки)

Здравствуйте, никак не могу сообразить что и куда передает this. Вот например в этом коде создан объект типа Button, а потом вызывается конкретный метод, и получается что все параметры secondButton мы передаем в setOnClickListener так?Тоесть он вызывает сам себя как рекурсия?
Можете кто нибудь написать подобный пример, некий аналог что бы смысл был тот же, но только без применения this?
Java
1
2
Button secondButton = (Button) findViewById(R.id.rightButton);
secondButton.setOnClickListener(this);
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.02.2016, 00:38
Ответы с готовыми решениями:

Как в getExtra использовать стринговую переменную в качестве параметра?
Имею: Button button1 = (Button)findViewById(R.id.buttonone); ...

Свой layout в качестве параметра адаптера SimpleExpandableListAdapter
Добрый день! При изучении андроида в одном из примеров захотелось заменить стандартный элемент на...

Как заблокировать компьютер от самого себя?
Здравствуйте. Весьма необычная тема, поэтому прошу не удивляться. Страдаю таким...

Как получить путь до себя самого?)
Добрый день, глупый вопрос, наверное, но как получить путь до себя самого? То есть, к примеру ... ...

Как файлу самого себя переименовать?
Хочу сделать так: ехе файл сам себя заменяет другим. Но не знаю как:( В form_queryunload вписать...

4
liptonus777
32 / 32 / 22
Регистрация: 29.10.2015
Сообщений: 193
28.02.2016, 00:56 2
В this хранится ссылка на объект из которого вы вызываете метод.

Добавлено через 6 минут
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
public class Task implements ActionListener{
    Button b;
    public static void main(String[] args) {
        new Task().go();
    }
 
    public void go() {
        JFrame frame = new JFrame();
        b = new Button("TEST");
        frame.getContentPane().add(b);
        b.addActionListener(this);
        frame.setSize(200,200);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
 
 
    public void actionPerformed(ActionEvent e) {
        b.setLabel("HELLO");
    }
 
}
В данном примере в метод b.addActionListener(this);
передаётся this, это значит что именно в этом классе, из которого вы вызываете этот метод будет реализован actionPerformed. Если бы он был реализован в другом классе, нужно было бы указывать ссылку на него.

Добавлено через 5 минут
Это раздел андроида Но думаю пример подойдёт
1
Kression
0 / 0 / 0
Регистрация: 06.09.2014
Сообщений: 37
28.02.2016, 10:54  [ТС] 3
liptonus777, Спасибо, а можно в вашем примере обойтись без this? Допустим создать новый объект класса ActionListener, и его уже передавать в качестве параметра в b.addActionListener?Если не сложно напишите пожалуйста аналог кода , что бы я уже окончательно осознал
0
liptonus777
32 / 32 / 22
Регистрация: 29.10.2015
Сообщений: 193
28.02.2016, 19:35 4
Лучший ответ Сообщение было отмечено Kression как решение

Решение

Kression,
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
public class Task{
    Button b;
    public static void main(String[] args) {
        new Task().go();
    }
 
    public void go() {
        JFrame frame = new JFrame();
        b = new Button("TEST");
        frame.getContentPane().add(b);
        b.addActionListener(new buttonListener());
        frame.setSize(200,200);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
 
    public class buttonListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            b.setLabel("HELLO");
        }
    }
 
}
Тут создаётся внутренний класс чтобы иметь доступ к кнопке. Если доступ не нужен, можно и в отдельном классе сделать. Потом в строке
Java
1
b.addActionListener(new buttonListener());
создаём экземпляр этого класса и передаём его методу. Можно и как в первом примере создать экземпляр класса Task и его передавать в метод. Но this намного удобнее
1
den_sol
0 / 0 / 0
Регистрация: 26.02.2016
Сообщений: 4
29.02.2016, 19:22 5
Kression, Если есть желание копнуть глубже, то давай разбираться:
Java
1
2
Button secondButton = (Button) findViewById(R.id.rightButton);
secondButton.setOnClickListener(this);
Предположим что контекст такой:
Java
1
2
3
4
5
6
7
8
9
10
11
public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Button secondButton = (Button) findViewById(R.id.rightButton);
        secondButton.setOnClickListener(this);
    }
}
(Спека о this) В данном случае this - это ссылка на текущий объект, т.е. на текущий экземпляр класса MainActivity. Проверим это.
Я буду пользоваться Android Studio. Пока закомментируем код с кнопкой.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
//        Button secondButton = (Button) findViewById(R.id.rightButton);
//        secondButton.setOnClickListener(this);
 
        Log.d(TAG, "'this' is instance of " + this.getClass().getName());
    }
}
Поясните как this передает самого себя в качестве параметра

Разобрались.
Теперь что хочет метод setOnClickListener - он хочет что-нибудь реализовавшее интерфейс View.OnClickListener :
Поясните как this передает самого себя в качестве параметра

окей, почему он хочет именно это - тоже указано - метод setOnClickListener во внутренней реализации будет дергать какой-нибудь метод у переданного объекта. (т.е. использовать как колбэк).
Посмотрим внимательней на этот интерфейс - он хочет реализацию метода onClick - значит его и будет дёргать .
Хорошо. Значит нужно что-нибудь передать в этот метод подходящее, реализующее интерфейс View.onClickListener.
Как уже ответил liptonus777, есть как минимум три варианта:
1) можно создать внутренний класс, реализующий этот интерфейс и передать его экземпляр.
Поясните как this передает самого себя в качестве параметра

2) можно сделать тоже самое используя анонимный класс. ($ знак доллара при выводе в имени класса значит первым анонимный класс в MainActivity)
Поясните как this передает самого себя в качестве параметра

3) а можно реализовать этот интерфейс в нашем классе (... MainActivity ... implements View.OnClickListener). Это и есть тот вариант при котором мы передаём в метод this т.к. именно объект нашего класс теперь реализует необходимый интерфейс.
Поясните как this передает самого себя в качестве параметра


Вот и всё.

Если есть желание посмотреть подробней как же он будет дёргать и что, то можно декомпилировать (ctrl+click по методу) класс View (который является корневым родителем Button).
Смотрим?
упрощённо, пропуская некоторые моменты:
1) Записываем объект, который нужно будет дёрнуть, в поле mOnClickListener внутреннего объекта mListenerInfo (который возвращает метод getListenerInfo())
Поясните как this передает самого себя в качестве параметра

Поясните как this передает самого себя в качестве параметра

2) Окей, куда-то сохранили наш объект. Что дальше? Дальше ставим точку остановки на onClick и смотрим откуда мы сюда пришли.
Поясните как this передает самого себя в качестве параметра

3) Пришли из performClick. Ищем его в классе View. Смотрим.
Поясните как this передает самого себя в качестве параметра

и видим что те поля mOnClickListener и mListenerInfo как раз и используются.
И дёргается onClick который мы и реализовали в MainActivity. (а this который передаём в методе performClick это текущий экземпляр класса View).

Вот теперь совсем всё.
Приятной работы!
0
29.02.2016, 19:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.02.2016, 19:22

Как удалить MovieClip из нутри самого себя
Здрасти. Подскажите. Как удалить MovieClip из нутри самого себя???

Как jsp-тегу посчитать самого себя?
Здравствуйте!! Допустим на jsp-странице несколько раз встречается один и тот же кастом тег. Как...

Как экземпляру класса изменить тип самого себя?
Есть класс1, наследованный от класса класс-предок. Он лежит в list<класс-предок>. Нужно, не меняя...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru