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

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

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

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

28.02.2016, 00:38. Просмотров 288. Ответов 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 передает самого себя в качестве параметра
Посмотрите здесь:

Как отменить Checked \ Selected CheckBox из самого события на Selected в Listener Android
Как в getExtra использовать стринговую переменную в качестве параметра? Android
Не могу заставить себя взять и написать плеер для Android Android
Android Как пост запросом отправить два параметра
Android Как установить Gif анимацию в качестве фона?
Поясните про поддержку разных экранов Android
Android Свой layout в качестве параметра адаптера SimpleExpandableListAdapter
Как называется View, который представляет из себя "площадку" для размещения контента (на скриншоте) Android
Android Смартфон в качестве эмулятора
Передает ли Input Method Service какой либо интент Android
Android Телефон в качестве ПУ для Arduino
Как сделать, чтобы элемент пропускал сквозь себя нажатия 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 намного удобнее
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 передает самого себя в качестве параметра
Ответ Создать тему
Опции темы

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