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

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

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

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

28.02.2016, 00:38. Просмотров 306. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Поясните как this передает самого себя в качестве параметра (Программирование Android):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
liptonus777
32 / 32 / 17
Регистрация: 29.10.2015
Сообщений: 192
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 / 17
Регистрация: 29.10.2015
Сообщений: 192
28.02.2016, 19:35 #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 намного удобнее
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.02.2016, 19:22
Привет! Вот еще темы с ответами:

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

Искать файл, который задан в качестве первого параметра, в каталогах, заданных в качестве остальных параметров - CMD/BAT
Нужен командный файл, который будет искать файл, который задан в качестве первого параметра в каталогах, заданных в качестве остальных...

Как передать функцию в качестве параметра? - C++
Помгите плиз, не получается передать одну функцию как параметр другой я пробовал так: в заголовочном файле: typedef double...

Как прередать контрол в качестве параметра? - Visual Basic
Как решить сабж, не прибегая к индексации контролов?? т.е если писать sub rr(contr as Controls) contr.combo1. .... ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
29.02.2016, 19:22
Ответ Создать тему
Опции темы

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