У меня есть два класса. Во-первых, это деятельность, во-вторых, фрагмент, где у меня есть некоторые EditText
. В действии у меня есть подкласс с асинхронной задачей, и в методе doInBackground
я получаю некоторый результат, который я сохраняю в переменную. Как я могу отправить эту переменную из подкласса "моя деятельность" в этот фрагмент?
android
android-fragments
user1302569
источник
источник
getArguments().getString(key)
Также Вы можете получить доступ к данным активности из фрагмента:
Деятельность:
Фрагмент:
источник
Bundle
класс для передачи информации. В качестве альтернативы вы можете сделать этотgetMyData()
метод унаследованным и реализованным из интерфейса иFragment
проверить, возвращает ли getActivityinstanceof
интерфейс вonAttach()
.Я нашел много ответов здесь @ stackoverflow.com, но определенно это правильный ответ:
"Отправка данных от активности к фрагменту в Android".
Деятельность:
Фрагмент:
Чтение значения во фрагменте
или просто
источник
Этот ответ может быть слишком поздно. но это будет полезно для будущих читателей.
У меня есть несколько критериев. Я закодировал для выбора файла от намерения. и выбранный файл для передачи в конкретный фрагмент для дальнейшего процесса. У меня есть много фрагментов, имеющих функциональность выбора файлов. в то время каждый раз проверять условие и получать фрагмент и передавать значение довольно отвратительно. Итак, я решил передать значение с помощью интерфейса.
Шаг 1: Создайте интерфейс в Основном действии.
Шаг 2. Создайте ссылку SelectedBundle для той же операции
Шаг 3: создайте метод в той же операции
Шаг 4: Необходимо инициализировать ссылку SelectedBundle, для которой все фрагменты нуждаются в функции выбора файлов. Вы помещаете этот код в
onCreateView(..)
метод фрагментаШаг 5: моем случае мне нужно передать изображение Uri из HomeActivity во фрагмент. Итак, я использовал эту функциональность в методе onActivityResult.
onActivityResult из MainActivity, передайте значения фрагментам, используя интерфейс.
Примечание: ваш случай может быть другим. Вы можете позвонить из любого места из вашей HomeActivity.
Вот и все. Реализуйте каждый фрагмент, который вам нужен, в FragmentClass. Ты замечательный. ты сделал. ВОТ ЭТО ДА...
источник
Основная идея использования Fragments (F) заключается в создании многократно используемых самодостаточных компонентов пользовательского интерфейса в приложениях для Android. Эти фрагменты содержатся в действиях, и существует распространенный (лучший) способ создания путей связи из A -> F и FA. Необходимо обмениваться информацией между FF через действие, потому что тогда только фрагменты становятся разъединенными и самодостаточными.
Таким образом, передача данных из A -> F будет такой же, как объяснено ρяσѕρєя K. В дополнение к этому ответу, после создания фрагментов внутри Activity, мы также можем передавать данные фрагментам, вызывающим методы во Fragments.
Например:
источник
Лучший и удобный подход - вызвать экземпляр фрагмента и отправить данные в это время. каждый фрагмент по умолчанию имеет метод экземпляра
так что вы будете называть свой фрагмент из активности следующим образом:
* R.id.container - это идентификатор моего FrameLayout
поэтому в MyFragment.newInstance («data1», «data2») вы можете отправлять данные во фрагмент, а в своем фрагменте вы получаете эти данные в MyFragment newInstance (String param1, String param2)
а затем в методе фрагмента onCreate вы получите данные:
источник
Я хотел бы добавить для начинающих, что разница между двумя наиболее часто задаваемыми ответами здесь заключается в различном использовании фрагмента.
Если вы используете фрагмент в классе java, где у вас есть данные, которые вы хотите передать, вы можете применить первый ответ для передачи данных:
Однако, если вы используете, например, код по умолчанию, предоставленный Android Studio для фрагментов с вкладками, этот код не будет работать.
Это не будет работать, даже если вы замените PlaceholderFragment по умолчанию на FragmentClasses, и даже если вы исправите FragmentPagerAdapter в новой ситуации, добавив переключатель для getItem () и другой переключатель для getPageTitle () (как показано здесь) )
Предупреждение: упомянутый выше клип содержит ошибки кода, которые я объясню позже, но полезно посмотреть, как вы переходите от кода по умолчанию к редактируемому коду для фрагментов с вкладками)! Остальная часть моего ответа имеет гораздо больше смысла, если вы рассмотрите java-классы и xml-файлы из этого клипа (представитель для первого использования фрагментов с вкладками в сценарии новичка).
Основная причина, по которой наиболее одобренный ответ на этой странице не сработает, заключается в том, что в этом коде по умолчанию для фрагментов с вкладками фрагменты используются в другом классе Java: FragmentPagerAdapter!
Таким образом, для отправки данных у вас возникает желание создать пакет в MotherActivity и передать его в FragmentPagerAdapter, используя ответ № 2.
Только это снова не так. ( Возможно, вы могли бы сделать это так, но это просто осложнение, которое на самом деле не нужно ).
Я думаю, что правильный / более простой способ сделать это - передать данные непосредственно в рассматриваемый фрагмент, используя ответ № 2. Да, между фрагментами с вкладками будет тесная связь между заданием и фрагментом, но это своего рода ожидание. Я бы даже посоветовал вам создать фрагменты с вкладками внутри Java-класса MotherActivity (в виде подклассов, так как они никогда не будут использоваться вне MotherActivity) - это просто, просто добавьте в Java-класс MotherActivity столько фрагментов, сколько вам нужно, вот так:
Таким образом, чтобы передать данные из MotherActivity в такой фрагмент, вам нужно создать частные строки / связки выше onCreate вашей материнской активности, которые вы можете заполнить данными, которые хотите передать во фрагменты, и передать их через метод, созданный после onCreate (здесь он называется getMyData ()).
И затем в классе фрагмента вы используете getMyData:
Если у вас есть запросы к базе данных, я советую вам делать их в MotherActivity (и передавать их результаты в виде строк / целых чисел, прикрепленных к ключам внутри пакета, как показано выше), так как внутри фрагментов с вкладками ваш синтаксис станет более сложным (это становится getActivity (), например, и getIntent становится getActivity (). getIntent), но у вас также есть возможность сделать то, что вы хотите.
Мой совет для начинающих - сосредоточиться на маленьких шагах. Во-первых, получите намерение открыть очень простое действие с вкладками без передачи ЛЮБЫХ данных. Это работает? Открывает ли он ожидаемые вами вкладки? Если нет, то почему?
Начните с этого, и, применяя решения, подобные представленным в этом ролике , посмотрите, чего не хватает. Для этого конкретного клипа файл mainactivity.xml никогда не отображается. Это, безусловно, смущает вас. Но если вы обратите внимание, вы увидите, что, например, контекст (tools: context) неверен в файлах фрагментов xml. Каждый фрагмент XML должен указывать на правильный класс фрагмента (или подкласс, используя разделитель $).
Вы также увидите, что в основной Java-класс активности вам нужно добавить tabLayout.setupWithViewPager (mViewPager) - сразу после строки TabLayout tabLayout = (TabLayout) findViewById (R.id.tabs); без этой строки ваше представление на самом деле не связано с XML-файлами фрагментов, но показывает ТОЛЬКО XML-файл основного действия.
В дополнение к строке в Java-классе основного действия в XML-файле основного действия необходимо изменить вкладки в соответствии с вашей ситуацией (например, добавить или удалить TabItems). Если у вас нет вкладок в основном XML-задании, возможно, вы не выбрали правильный тип действия при первом его создании (новое действие - действие с вкладками).
Обратите внимание, что в последних 3 абзацах я говорю о видео! Поэтому, когда я говорю «основное действие XML», это основное действие XML в видео, которое в вашей ситуации является XML-файлом MotherActivity.
источник
Если вы передадите ссылку на (конкретный подкласс) фрагмента в асинхронную задачу, вы сможете получить доступ к фрагменту напрямую.
Некоторые способы передачи ссылки на фрагмент в асинхронную задачу:
class FooTask extends AsyncTask
), передайте ваш фрагмент в конструктор.источник
Иногда вы можете получить намерение в своей деятельности, и вам нужно передать информацию в ваш рабочий фрагмент.
Полученные ответы в порядке, если вам нужно запустить фрагмент, но если он все еще работает,
setArguments()
это не очень полезно.Другая проблема возникает, если переданная информация приведет к взаимодействию с вашим пользовательским интерфейсом. В этом случае вы не можете вызвать что-то подобное,
myfragment.passData()
потому что android быстро скажет, что взаимодействовать может только поток, создавший представление.Поэтому я предлагаю использовать приемник. Таким образом, вы можете отправлять данные из любого места, включая деятельность, но работа будет выполняться в контексте фрагмента.
В вашем фрагменте
onCreate()
:В вашей деятельности:
источник
Очень старый пост, все же я осмелюсь добавить небольшое объяснение, которое было бы полезно для меня.
Технически вы можете напрямую устанавливать элементы любого типа во фрагменте из действия.
Так почему Бандл?
Причина очень проста - Bundle предоставляет единый способ обработки:
- создание / открытие фрагмента
- реконфигурация (поворот экрана) - просто добавьте начальный / обновленный пакет в outState в onSaveInstanceState ()
- восстановление приложения после сбора мусора в фоновом режиме ( как с реконфигурацией).
Вы можете (если вам нравятся эксперименты) создать обходной путь в простых ситуациях, но Bundle-подход просто не видит разницы между одним фрагментом и тысячей в backstack - он остается простым и понятным.
Вот почему ответ @Elenasys - самое элегантное и универсальное решение.
И вот почему ответ, данный @Martin, имеет подводные камни
источник
лучший подход для отправки данных из класса активности во фрагмент - передача через методы установки. подобно
и получить эти данные из класса легко.
источник
От
Activity
вас отправляют данные с Bundle как:А в
Fragment
методе onCreateView получают данные:источник
Если после инициализации
activity
необходимоfragment
выполнить действие, самый простой способ -activity
вызвать метод дляfragment
экземпляра. Вfragment
, добавьте метод:а затем в
activity
, получить доступ к сfragment
помощьюfragment
диспетчера и вызватьmethod
:и тогда он
activity
может общаться напрямую сfragment
помощью этогоmethod
.источник
onCreateView
метод во фрагменте. был действительно полезенИспользуйте следующий интерфейс для связи между действием и фрагментом
Или используйте следующий универсальный приемник для двусторонней связи с использованием интерфейса
метод фрагментации
вы можете привести свой контекст
GenericConnector
вonAttach(Context)
слишкомв вашей деятельности
в вашем фрагменте
Примечание: никогда не используйте это как
"".toString().toString().toString();
способ.источник
только что наткнулся на этот вопрос, в то время как большинство методов, описанных выше, будут работать. Я просто хочу добавить, что вы можете использовать библиотеку Event Bus , особенно в тех случаях, когда компонент (Activity или Fragment) не был создан, он подходит для всех размеров проектов android и многих вариантов использования. Я лично использовал его в нескольких проектах на PlayStore.
источник
Вы можете создать открытый статический метод во фрагменте, где вы получите статическую ссылку на этот фрагмент, а затем передадите данные этой функции и установите эти данные в качестве аргумента в том же методе и получите данные через getArgument для метода фрагмента oncreate, и установите эти данные как локальные переменные.
источник
Самый разумный и проверенный способ передачи данных между фрагментами и действиями - это создание переменных, например:
Затем, чтобы передать данные из фрагмента в действие, мы делаем это в методе onActivityCreated:
Теперь вы можете получить значение StorageUtil.employees отовсюду. Удачи!
источник
Мое решение состоит в том, чтобы написать статический метод внутри фрагмента:
Таким образом, я уверен, что все данные, которые мне нужны, находятся внутри фрагмента перед любой другой возможной операцией, которая может потребоваться для работы с ним. Также это выглядит чище на мой взгляд.
источник
Я столкнулся с аналогичной проблемой при использовании новейшего компонента архитектуры навигации. Перепробовал весь вышеупомянутый код с передачей пакета из моей деятельности по вызову во Fragment.
Наилучшим решением, следуя последним тенденциям развития Android, является использование View Model (часть Android Jetpack).
Создайте и инициализируйте класс ViewModel в родительском Activity. Обратите внимание, что эта ViewModel должна быть общей для действия и фрагмента.
Теперь внутри onViewCreated () фрагмента инициализируйте Same ViewModel и настройте Observers для прослушивания полей ViewModel.
Вот полезный, подробный учебник, если вам нужно.
https://medium.com/mindorks/how-to-communicate-between-fragments-and-activity-using-viewmodel-ca733233a51c
источник
В вашей деятельности объявите статическую переменную
Тогда в вашем фрагменте сделайте как следует
источник