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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Программирование Android Посоветуйте книгу по созданиям игр на Android http://www.cyberforum.ru/android-dev/thread1672137.html
Желательно поновее. Интересуют 2D игры. Спасибо заранее!
Программирование Android Как сохранить новые кнопочки, текстовые поля и тд Добрый день. Посоветуйте, про что именно почитать. Задача сохранять при выключении приложения добавленные программно кнопочки, текстовые поля и другие элементы интерфейса. http://www.cyberforum.ru/android-dev/thread1672133.html
Прочитать большой JSON Программирование Android
Есть очень большой JSON по ссылке http://api.giphy.com/v1/gifs/search?q=funny+cat&api_key=dc6zaTOxFJmzC Я его читаю следующим кодом private String getJSONObject(String _url) throws Exception {...
Gridlayout out of screen Программирование Android
может кто подсказать, почему происходит выход за пределы экрана? и как это исправить юзаю Android Studio во вложении рисунок, код <?xml version="1.0" encoding="utf-8"?>
Программирование Android Grow heap ImageView http://www.cyberforum.ru/android-dev/thread1672034.html
Добрый день, пытаюсь немного оптимизировать свой код. Наибольшие проблемы на данный момент вызывает ImageView. ( ImageView находится в каждом из элементов CardView ) Фотки должны быть во всю ширину...
Программирование Android Как выделить item в Spinner? спинер работает в режиме диалога (т.е. сразу появляется открытым).... по клику на айтеме его background закрашивается в красивый синий цвет, как закрепить это состояние background... чтобы при... подробнее

Показать сообщение отдельно
den_sol
0 / 0 / 0
Регистрация: 26.02.2016
Сообщений: 4
29.02.2016, 19:22
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
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru