Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Kression
0 / 0 / 0
Регистрация: 06.09.2014
Сообщений: 37
#1

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

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

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

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

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

Как сделать, чтобы элемент пропускал сквозь себя нажатия - Программирование Android
Нужно поверх всего экрана наложить сетку, чтобы при этом она не мешала нажатию на другие элементы, находящиеся за ней

Как установить Gif анимацию в качестве фона? - Программирование Android
Слышал, что есть какие-то библиотеки, но там сильно муторно их прицеплять к проекту

Как пост запросом отправить два параметра - Программирование Android
Как пост запросом отправить два параметра один из которых jpg файл? Второй параметр строка. Изображение для отправки подготавливаю так: ...

Передает ли Input Method Service какой либо интент - Программирование Android
Задача состоит в том что надо запустить активность либо сервис при вызове клавиатуры каким либо приложением(возможно ли это точно не...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
liptonus777
32 / 32 / 17
Регистрация: 29.10.2015
Сообщений: 182
28.02.2016, 00:56     Поясните как this передает самого себя в качестве параметра #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 минут
Это раздел андроида Но думаю пример подойдёт
Kression
0 / 0 / 0
Регистрация: 06.09.2014
Сообщений: 37
28.02.2016, 10:54  [ТС]     Поясните как this передает самого себя в качестве параметра #3
liptonus777, Спасибо, а можно в вашем примере обойтись без this? Допустим создать новый объект класса ActionListener, и его уже передавать в качестве параметра в b.addActionListener?Если не сложно напишите пожалуйста аналог кода , что бы я уже окончательно осознал
liptonus777
32 / 32 / 17
Регистрация: 29.10.2015
Сообщений: 182
28.02.2016, 19:35     Поясните как this передает самого себя в качестве параметра #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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 намного удобнее
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.02.2016, 19:22     Поясните как this передает самого себя в качестве параметра
Еще ссылки по теме:

Как отменить Checked \ Selected CheckBox из самого события на Selected в Listener - Программирование Android
В самом событии - Листенере надо отменить установку галки. Чтобы не зациклилось надо установить без вызова опять этого листенера. Как? ...

Как называется View, который представляет из себя "площадку" для размещения контента (на скриншоте) - Программирование Android
Здравствуйте! Пожалуйста, скажите, как называется View на скриншоте. То есть, вот у нас есть пост. И он размещён на белой "площадке". Как...

Поясните синтаксис XML - Программирование Android
Для чего нужна выделенная угловая скобка? <?xml version="1.0" encoding="utf-8"?> <RelativeLayout...

Поясните про поддержку разных экранов - Программирование Android
Я туплю или эмулятор глючит ? В genymotion сделал 3 устройства, что бы поиграться разными layout для разных экранов: 1. 480х800 2....

Поясните про права для Marshmallow - Программирование Android
Собирал своё приложение для версии Android 4.0.3 c API 15. Проверял на соответствующем планшете. Всё работает, начал изучать возможность...

Смартфон в качестве эмулятора - Программирование Android
Позавчера работало, сегодня выдает следующее (вложение). Установил в течении 15 мин. 8 каких-то драйверов, которые в других форумах...


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

Или воспользуйтесь поиском по форуму:
den_sol
0 / 0 / 0
Регистрация: 26.02.2016
Сообщений: 4
29.02.2016, 19:22     Поясните как this передает самого себя в качестве параметра #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).

Вот теперь совсем всё.
Приятной работы!
Yandex
Объявления
29.02.2016, 19:22     Поясните как this передает самого себя в качестве параметра
Ответ Создать тему
Опции темы

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