Полный список
— передаем данные с помощью Intent
На прошлых уроках мы узнали, что такое Intent и как им пользоваться. Из одного Activity мы просто вызывали другое, передавая action. Теперь научимся передавать данные. Сделаем простейшее приложение. На первом экране мы будем вводить наше имя и фамилию, а второй экран будет эти данные отображать. Передавать данные будем внутри Intent.
Создадим проект:
Project name: P0281_IntentExtras
Build Target: Android 2.3.3
Application name: IntentExtras
Package name: ru.startandroid.develop.p0281intentextras
Create Activity: MainActivity
Открываем main.xml и рисуем экран с полями и кнопкой отправки:
В EditText будем вводить имя и фамилию, а кнопка Submit будет вызывать другой экран и передавать ему эти данные.
Пишем код для MainActivity.java:
Определяем поля ввода и кнопку. Кнопке присваиваем обработчик – Activity (this). Рассмотрим реализацию метода onClick. Мы создаем Intent с использованием класса, а не action. Если помните, с такого способа мы начинали знакомство с Intent. Напомню — это означает, что система просмотрит манифест файл нашего приложения, и если найдет Activity с таким классом – отобразит его. ViewActivity пока не создан, поэтому код будет подчеркнут красным. Это не мешает нам сохранить файл. Чуть позже мы создадим это Activity и ошибка исчезнет.
Итак, Intent создан, смотрим код дальше. Используется метод putExtra. Он имеет множество вариаций и аналогичен методу put для Map, т.е. добавляет к объекту пару. Первый параметр – это ключ(имя), второй — значение.
Мы поместили в Intent два объекта с именами: fname и lname. fname содержит значение поля etFName, lname – значение поля etLName. Остается только отправить укомплектованный Intent с помощью метода startActivity.
Теперь создадим второе Activity. Назовем его ViewActivity.
Создаем для него layout-файл view.xml:
Здесь просто TextView, который будет отображать пришедшие данные.
Создаем класс ViewActivity. И пишем код:
Находим TextView, затем получаем Intent и извлекаем из него String-объекты с именами fname и lname. Это те самые значения, которые мы помещали в коде MainActivity.java. Формируем строку вывода в TextView с использованием полученных данных.
Не забудьте прописать ViewActivity в манифесте. На этот раз никаких Intent Filter не нужно, т.к. мы точно знаем имя класса Activity и используем явный вызов.
Все сохраним и запустим.
Видим такой экран:
Заполняете поля как пожелаете. Я напишу John в поле First Name и Smith в поле Last Name.
ViewActivity отобразилось, считало данные из Intent и вывело их на экран.
Поместить в Intent можно данные не только типа String. В списке методов Intent можно посмотреть все многообразие типов, которые умеет принимать на вход метод putExtra.
На следующем уроке:
— вызываем Activity с возвратом результата
Присоединяйтесь к нам в Telegram:
— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.
— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование
— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня
— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме
Источник
Передача данных из одного класса в другой
Передача значения из одного класса в другой
Доброго времени суток! Проблема следующая: В MainActivity моего проекта лежит список, мне нужно.
Передача данных из одного класса в другой
Доброе время суток форумчане =) Пишу класс для общения с php: отправки и получения данных. Но.
Передача данных из одного класса в другой
Подскажите что подправить. Как правильно передать переменные? :wall: public class Salary < .
Вызов метода и передача данных из одного класса в другой
Есть два класса, основной(Form1) и дополнительный(Class1). В дополнительном классе находится метод.
AliasAstro, автор, решил проблему? У меня такая же ситуация.
Не получается получить координаты двигающегося imageView.
И пропускать ничего не надо, потому что новичок, не может знать, что надо пропускать, а что нет.
Касаемо темы. Я не знаю чем руководствовался ТС, когда вынес AsyncTask в внешний класс. Обычно такие классы реализуют как(внутренний/вложенный класс/inner classes). Даже примеры так написаны.
Если все реализовать так, то проблем с доступом к переменным быть не должно.
пытаюсь использовать таймер, для считывания координат каждые 100 миллисекунд, но, так, как я объединил несколько разных примеров кода, найденных в Интернет, получается не очень. Не получается отправить содержимое переменной «x» в реализацию класса AsyncTask.
Добавлено через 12 минут
Так тоже не вышло:
А где вы поток запускаете, в какой момент? Где такой код?
Я прям не сдержался. Из всех сих игнорировал тему
Т.е. вы, убрали запуск потока, и теперь не знаете почему выражения в потоке — не работают. Вы серьезно?
Отвечу — вычисления в потоке не работают потому что, поток не запущен.
Vladimirys, я сразу слился)
PS. Хороший сайт Климова, правильно там и учите Андроид, для новичков более мене поясняет.
Я просто не мог подумать что все так запущено. Ну примеры же они все расписаны. Ну как так то
Передача массива из одного класса в другой
Есть 2 файла классов и в одном объявляется массив n элементов. Как его передать во второй класс.
Передача переменной из одного класса в другой
Здравствуйте, пишу лабораторную и что-то чувствую, что прогер из меня неважный, весь интернет.
Передача массива одного класса в другой С++
Доброго времени суток. Столкнулся с проблемой, есть класс который заполняет массив, этот массив.
Передача коллекции из одного класса в другой
Добрый день, столкнулся с проблемой. Как реализовать передачу данных коллекции через.
Передача информации из одного класса в другой
У меня есть класс KeyCreator, там генерируется public string GetSerialNum(),public string.
Источник
Передача данных между классами android studio
Мы уже работали над созданием перехода между двумя Activity. Сегодняшний урок довольно похож, но имеет некоторое усложнение — мы будем не просто переходить с одного Activity на другое, но и передавать между ними текстовые данные.
Суть приложения будет в том, что в одном окне будет две формы EditView для заполнения текстом и кнопка Button перехода на другое окно, а в другом — два элемента TextView, которые будут отображать текст, который был введен в EditView в первой Activity и кнопка возвращения назад.
Создаем новый проект с Blank Activity, все названия я оставлю по умолчанию.
Для начала настроим интерфейс первого Activity. Открываем файл activity_main.xml. Мы добавим сюда 2 элемента EditText для ввода текста и кнопку Button:
Все, внешний вид первого Activity готов:
Теперь нам нужно создать новый Activity. В папке Java/имя_вашего_приложения нашего приложения создаем новый Java Class. Клик правой кнопкой мышки по указанной папке New — Java Class:
Зададим ему имя Second. Проследите, чтобы созданный класс Second.java находился в одной папке с MainActivity.java :
Для этого класса нужно создать соответствующий layout — файл, который будет отвечать за его внешний вид (интерфейс). В папке res/layout создаем (правый клик по папке layout — New — Layout resourse file) файл по имени second.
Сразу настроим внешний вид второго Activity. Открываем файл созданный second.xml и добавляем 2 элемента TextView и кнопку Button:
Внешне это выглядит так:
В файле activity_main.xml мы создавали кнопку «Передать» и создали для нее метод нажатия (подчеркнуто):
Чтобы описать процесс нажатия, нужно добавить метод обработки нажатия в MainActivity.java. Для этого ставим курсор на слово «Send» в коде кнопки и жмем комбинацию Alt+Enter и выбираем первую строку Create ‘Send(View)’ in ‘MainActivity’.
Переходим к редактированию файла MainActivity.java . Объявляем используемые переменные, привязываем их к созданным элементам интерфейса, с оздаем с помощью класса Intent переход на Second.java, а также настраиваем получение текстовых данных с элементов EditText для передачи в Second.java :
Создадим метод для обработки нажатия кнопки «Назад» в файле second.xml. Делаем все аналогично кнопке «Передать» (курсор на «Back» — Alt+Enter — Enter):
Теперь переходим к редактированию файла Second.java. Для начала нужно привязать его к second.xml интерфейсу:
Теперь объявляем объекты, привязываем их к созданным в файле разметки интерфейса, настраиваем строковые ресурсы с полученных с первого Activity данных и выводим на экран, а также для обработчика нажатия клавиши пишем код перехода обратно:
Остается только объявить о созданном Second.java в файле манифеста. Открываем AndroidManifest.xml и добавим туда между тегами :
Вот и все, приложение готово, можно переходить к тестированию.
Источник
Android Fragment Result Listener
В Android передача данных между фрагментами может осуществляться разными способами: передача через родительскую Activity, используя ViewModel или даже Fragments API. Fragment Target API с недавних пор получил статус Deprecated и вместо него Google рекомендует использовать Fragment result API.
Что такое Fragment result API? Это новый инструмент от Google который позволяет передавать данные между фрагментами по ключу. Для этого используется FragmentManager, который в свою очередь реализует интерфейс FragmentResultOwner. FragmentResultOwner выступает в качестве центрального хранилища для данных, которые мы передаем между фрагментами.
Как это работает?
Как упоминалось выше, наш FragmentManager реализует интерфейс FragmentResultOwner, который хранит в себе ConcurrentHashMap . Эта HashMap хранит наши Bundle-ы по строковому ключу. Как только один из фрагментов подписывается (или уже подписан) то он получает результат по тому самому ключу.
Что важно знать:
- Если какой-либо фрагмент подписывается на результат методом setResultFragmentListener() после того, как отправляющий фрагмент вызовет setFragmentResult() , то он немедленно получит результат
- Каждую связку “Key + Result (Bundle)“ фрагмент получает только 1 раз
- Фрагменты которые находятся в бек стеке получат результат только после того как перейдут в состояние STARTED
- После того как фрагмент перейдет в состояние DESTROYED мы больше не сможем подписываться на ResultListener
Как это выглядит в коде?
Передача данных
Для передачи данных в другой фрагмент нам необходимо вызвать метод:
В параметры метода мы кладем ключ, который и будет нашим идентификатором для получения данных и сам Bundle. Этот Bundle будет содержать в себе передаваемые данные.
Получение данных
Для получения данных через FragmentManager мы регистрируем наш FragmentResultListener и задаем ключ по которому мы будем получать данные. Тот самый ключ который мы указывали в методе FragmentManager.setFragmentResult()
Здесь мы видим 2 аргумента: key: String и bundle: Bundle.
Первый — это тот самый ключ, по которому мы передаем сюда данные. Второй — Bundle, в котором лежат переданные данные.
Parent Fragment Manger
Выбор FragmentManager-а для передачи данных между фрагментами зависит от принимающего фрагмента:
- Если оба фрагмента находятся в одном и том же FragmentManager (например оба фрагмента находятся в Activity), то мы должны использовать родительский FragmentManager, который хранит в себе Activity
- Если у нас один фрагмент вложен в другой фрагмент, то для передачи данных мы используем childFragmentManager (он же родительский фрагмент для принимающего фрагмента)
Важно понимать, что наш FragmentResultListener должен находиться в общем для двух фрагментов FragmentManager-е.
Тестирование
Для тестирования отправки/получения данных через FragmentResultListener, мы можем использовать FragmentScenario API, который предоставляет нам все преимущества тестирования фрагментов в изоляции.
Передача данных
Как мы можем протестировать, что наш фрагмент корректно отправляет данные через родительский FragmentManager? Для этого нам необходимо внутри теста отправить результат и проверить, что наш FragmentResultListener получил корректные данные:
Получение данных
Для проверки корректности получения данных мы можем симулировать отправку данных, используя родительский FragmentManager. Если в отправляющем фрагменте корректно установлен FragmentResultListener мы должны получить корректные данные проверяя сам листенер или последствие их получения.
Вывод
В данный момент FragmentResultListener находится в альфе, а это значит что возможно еще будут изменения со стороны Google. Но уже сейчас видно, что это достаточно крутой инструмент, для передачи данных между фрагментами, не создавая дополнительных интерфейсов и классов. Единственным нюансом остается, пожалуй то, что не совсем понятно, как и где лучше хранить ключи где, но это не кажется таким уж большим минусом.
Для того чтоб получить возможность использовать FragmentResultListener нам нужно подключить в зависимостях версию фрагментов 1.3.0-alpha04 или новее:
Источник