Отправлять данные из активности в fragment в android

У меня есть два classа. Во-первых, это активность, вторая – fragment, в котором у меня есть некоторые редакторы. В деятельности у меня есть подclass с задачей async и в методе doInBackground я получаю некоторый результат, который я сохраняю в переменной. Как я могу отправить эту переменную из подclassа «моя деятельность» в этот fragment?

Из действия вы отправляете данные с намерением:

 Bundle bundle = new Bundle(); bundle.putString("edttext", "From Activity"); // set Fragmentclass Arguments Fragmentclass fragobj = new Fragmentclass(); fragobj.setArguments(bundle); 

и в методе Fragment onCreateView:

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { String strtext = getArguments().getString("edttext"); return inflater.inflate(R.layout.fragment, container, false); } 

Также вы можете получить доступ к данным активности из fragmentа:

Мероприятия:

 public class MyActivity extends Activity { private String myString = "hello"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); ... } public String getMyData() { return myString; } } 

Фрагмент:

 public class MyFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { MyActivity activity = (MyActivity) getActivity(); String myDataFromActivity = activity.getMyData(); return view; } } 

Я нашел много ответов здесь @ stackoverflow.com, но определенно это правильный ответ:

«Отправка данных из активности в fragment в android».

Мероприятия:

  Bundle bundle = new Bundle(); String myMessage = "Stackoverflow is cool!"; bundle.putString("message", myMessage ); FragmentClass fragInfo = new FragmentClass(); fragInfo.setArguments(bundle); transaction.replace(R.id.fragment_single, fragInfo); transaction.commit(); 

Фрагмент:

Чтение значения в fragmentе

  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Bundle bundle = this.getArguments(); String myValue = bundle.getString("message"); ... ... ... } 

или просто

  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { String myValue = this.getArguments().getString("message"); ... ... ... } 

Этот ответ может быть слишком запоздалым. но это будет полезно для будущих читателей.

У меня есть некоторые критерии. Я закодирован, чтобы выбрать файл из намерения. и выбранный файл, который будет передан конкретному fragmentу для дальнейшего процесса. У меня есть много fragmentов, обладающих функциональностью набора файлов. в то время, каждый раз, проверяя условие и получая fragment и передавая значение, довольно отвратительно. поэтому я решил передать значение с помощью интерфейса.

Шаг 1. Создайте интерфейс для основной деятельности.

  public interface SelectedBundle { void onBundleSelect(Bundle bundle); } 

Шаг 2: создайте метод в той же деятельности

  public void setOnBundleSelected(SelectedBundle selectedBundle) { this.selectedBundle = selectedBundle; } 

Шаг 3: Создайте ссылку SelectedBundle для одной и той же деятельности

  SelectedBundle selectedBundle; 

Шаг 4: Нужно инициализировать ссылку SelectedBundle, которая является функциональной функцией filepicker для fragmentа. Вы размещаете этот код на своем fragmentе onCreateView(..)

  ((MainActivity)getActivity()).setOnBundleSelected(new MainActivity.SelectedBundle() { @Override public void onBundleSelect(Bundle bundle) { updateList(bundle); } }); 

Шаг 5: onActivityResult из MainActivity, передайте значения fragmentам с помощью интерфейса.

  @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { selectedBundle.onBundleSelect(bundle); } 

Это все. Внедрите каждый fragment, необходимый для FragmentClass. Ты замечательный. ты сделал. ВАУ…

Основная идея использования fragmentов (F) заключается в создании многократно используемых компонентов пользовательского интерфейса в приложениях для Android. Эти fragmentы содержатся в действиях, и есть общий (лучший) способ создания путей пути связи от A -> F и FA. Необходимо обмениваться между FF посредством Activity, потому что тогда только fragmentы становятся развязанными и самоподдерживающимися.

Таким образом, передача данных из A -> F будет такой же, как объясняется ρяσѕρєя K. В дополнение к этому ответу. После создания fragmentов внутри Activity мы также можем передавать данные методам вызова fragmentов в Fragments.

Например:

  ArticleFragment articleFrag = (ArticleFragment) getSupportFragmentManager().findFragmentById(R.id.article_fragment); articleFrag.updateArticleView(position); 

Если вы передадите ссылку на fragment (конкретный подclass) в задачу async, вы можете напрямую обратиться к fragmentу.

Некоторые способы передачи ссылки на fragment в асинхронную задачу:

  • Если ваша задача async является полноценным classом ( class FooTask extends AsyncTask ), передайте fragment в конструктор.
  • Если ваша задача async является внутренним classом, просто объявите конечную переменную Fragment в области, заданной задачей async, или как поле внешнего classа. Вы сможете получить доступ к этому из внутреннего classа.

Лучший и удобный подход – вызов экземпляра fragmentа и отправка данных в это время. каждый fragment по умолчанию имеет метод экземпляра

Например: если ваше имя fragmentа – MyFragment

поэтому вы будете называть свой fragment из такой активности:

 getSupportFragmentManager().beginTransaction().add(R.id.container, MyFragment.newInstance("data1","data2"),"MyFragment").commit(); 

* R.id.container – это идентификатор моего FrameLayout

поэтому в MyFragment.newInstance («data1», «data2») вы можете отправить данные fragmentу, а в вашем fragmentе вы получите эти данные в MyFragment newInstance (String param1, String param2)

 public static MyFragment newInstance(String param1, String param2) { MyFragment fragment = new MyFragment(); Bundle args = new Bundle(); args.putString(ARG_PARAM1, param1); args.putString(ARG_PARAM2, param2); fragment.setArguments(args); return fragment; } 

а затем в onCreate метод fragmentа вы получите данные:

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { mParam1 = getArguments().getString(ARG_PARAM1); mParam2 = getArguments().getString(ARG_PARAM2); } } 

поэтому теперь у mParam1 есть данные1 и mParam2 имеют данные2

теперь вы можете использовать этот mParam1 и mParam2 в своем fragmentе.

Очень старый пост, все же я осмелился добавить небольшое объяснение, которое было бы полезно для меня.

Технически вы можете напрямую устанавливать элементы любого типа в fragment из активности.
Итак, почему Bundle?
Причина очень проста: Bundle обеспечивает единый способ обработки:
– создание / открытие fragmentа
– реконфигурация (поворот экрана) – просто добавьте начальный / обновленный пакет в outState в onSaveInstanceState ()
– восстановление приложения после сбора мусора в фоновом режиме (как при реконфигурации).

Вы можете (если вам нравятся эксперименты) создать обходное решение в простых ситуациях, но подход Bundle просто не видит разницы между одним fragmentом и одной тысячей в стоге – он остается простым и понятным.
Вот почему ответ @Elenasys является самым элегантным и универсальным решением.
И вот почему ответ, данный @Martin, имеет подводные камни

Из операции вы отправляете данные с Bundle следующим образом:

 Bundle bundle = new Bundle(); bundle.putString("data", "Data you want to send"); // Your fragment MyFragment obj = new MyFragment(); obj.setArguments(bundle); 

И в режиме Fragment onCreateView получите данные:

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,`Bundle savedInstanceState) { String data = getArguments().getString("data");// data which sent from activity return inflater.inflate(R.layout.myfragment, container, false); } 

лучший способ отправки данных из classа активности в fragment проходит через методы сеттера. подобно

 FragmentClass fragmentClass = new FragmentClass(); fragmentClass.setMyList(mylist); fragmentClass.setMyString(myString); fragmentClass.setMyMap(myMap); 

и легко получить эти данные из classа.

Иногда вы можете получать Intent в своей деятельности, и вам нужно передать информацию в ваш рабочий fragment.
Даны ответы, если вам нужно запустить fragment, но если он все еще работает, setArguments() не очень полезен.
Другая проблема возникает, если переданная информация приведет к взаимодействию с вашим пользовательским интерфейсом. В этом случае вы не можете назвать что-то вроде myfragment.passData() потому что андроид быстро сообщит, что может взаимодействовать только stream, создавший представление.

Поэтому мое предложение – использовать приемник. Таким образом, вы можете отправлять данные из любого места, включая активность, но задание будет выполняться в контексте fragmentа.

В вашем fragmentе onCreate() :

 protected DataReceiver dataReceiver; public static final String REC_DATA = "REC_DATA"; @Override public void onCreate(Bundle savedInstanceState) { data Receiver = new DataReceiver(); intentFilter = new IntentFilter(REC_DATA); getActivity().registerReceiver(dataReceiver, intentFilter); } private class DataReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { int data= intent.getIntExtra("data", -1); // Do anything including interact with your UI } } 

В вашей деятельности:

 // somewhere Intent retIntent = new Intent(RE_DATA); retIntent.putExtra("data", myData); sendBroadcast(retIntent); 

Если необходимо, чтобы fragment выполнял действие после инициализации, самым простым способом является то, что activity вызывает метод на экземпляре fragment . В fragment добавьте метод:

 public class DemoFragment extends Fragment { public void doSomething(String param) { // do something in fragment } } 

а затем в activity получить доступ к fragment с помощью диспетчера fragment и вызвать method :

 public class MainActivity extends FragmentActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); DemoFragment fragmentDemo = (DemoFragment) getSupportFragmentManager().findFragmentById(R.id.fragmentDemo); fragmentDemo.doSomething("some param"); } } 

а затем activity может напрямую связываться с fragment , вызывая этот method .

Вы можете создать публичный статический метод в fragmentе, где вы получите статическую ссылку на этот fragment, а затем передаете данные этой функции и установите эти данные в аргумент в том же методе и получите данные через getArgument on oncreate метод fragmentа и установите эти данные в локальный переменные.

Используйте следующий интерфейс для связи между активностью и fragmentом

 public interface BundleListener { void update(Bundle bundle); Bundle getBundle(); } 

Или используйте следующий универсальный прослушиватель для двусторонней связи с использованием интерфейса

  /** * Created by Qamar4P on 10/11/2017. */ public interface GenericConnector { T getData(); void updateData(E data); void connect(GenericConnector connector); } 

метод демонстрации fragmentов

 public static void show(AppCompatActivity activity) { CustomValueDialogFragment dialog = new CustomValueDialogFragment(); dialog.connector = (GenericConnector) activity; dialog.show(activity.getSupportFragmentManager(),"CustomValueDialogFragment"); } 

вы можете использовать свой контекст для onAttach(Context) в onAttach(Context) тоже

в вашей деятельности

 CustomValueDialogFragment.show(this); 

в вашем fragmentе

 ... @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); connector.connect(new GenericConnector() { @Override public Object getData() { return null; } @Override public void updateData(Object data) { } @Override public void connect(GenericConnector connector) { } }); } ... public static void show(AppCompatActivity activity, GenericConnector connector) { CustomValueDialogFragment dialog = new CustomValueDialogFragment(); dialog.connector = connector; dialog.show(activity.getSupportFragmentManager(),"CustomValueDialogFragment"); } 

Примечание: никогда не используйте его как "".toString().toString().toString(); путь.

Я хотел бы добавить для новичков, что разница между двумя наиболее важными ответами здесь определяется разным использованием fragmentа.

Если вы используете fragment в classе java, где у вас есть данные, которые вы хотите передать, вы можете применить первый ответ для передачи данных:

 Bundle bundle = new Bundle(); bundle.putString("edttext", "From Activity"); Fragmentclass fragobj = new Fragmentclass(); fragobj.setArguments(bundle); 

Если, однако, вы используете, например, код по умолчанию, данный Android Studio для fragmentов с вкладками, этот код не будет работать.

Он не будет работать, даже если вы замените PlaceholderFragment по умолчанию на FragmentClasses и даже если вы исправите FragmentPagerAdapter в новую ситуацию, добавив переключатель для getItem () и еще один переключатель для getPageTitle () (как показано здесь )

Предупреждение: упомянутый выше клип имеет ошибки кода, которые я объясняю позже здесь, но полезно посмотреть, как вы переходите от кода по умолчанию к редактируемому коду для вкладных fragmentов)! Остальная часть моего ответа имеет гораздо больший смысл, если вы рассматриваете classы java и xml-файлы из этого клипа (представитель для первого использования fragmentов с вкладками в сценарии начинающих).

Основная причина, по которой самый высокий ответ с этой страницы не будет работать, заключается в том, что в этом коде по умолчанию для вкладных fragmentов fragmentы используются в другом classе java: FragmentPagerAdapter!

Итак, чтобы отправить данные, у вас возникает соблазн создать пакет в MotherActivity и передать его в FragmentPagerAdapter, используя ответ №2.

Только это неправильно. ( Возможно, вы могли бы сделать это так, но это просто сложность, которая на самом деле не нужна ).

Правильный / более простой способ сделать это, я думаю, состоит в передаче данных непосредственно на этот fragment, используя ответ №2. Да, будет жесткая связь между Activity и Fragment, НО, для вкладок, которые ожидаются. Я бы даже советовал вам создавать fragmentы с вкладками внутри classа Java MatActivity (как подclassы, так как они никогда не будут использоваться вне MotherActivity) – это просто, просто добавьте внутри classа Java MatActivity столько fragmentов, сколько вам нужно:

  public static class Tab1 extends Fragment { public Tab1() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.your_layout_name_for_fragment_1, container, false); return rootView; } }. 

Таким образом, чтобы передать данные из MotherActivity в такой fragment, вам нужно будет создать частные строки / расслоения над операцией onCreate вашей мамы, которую вы можете заполнить данными, которые хотите передать fragmentам, и передать их через метод, созданный после onCreate (здесь называется getMyData ()).

 public class MotherActivity extends Activity { private String out; private Bundle results; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_mother_activity); // for example get a value from the previous activity Intent intent = getIntent(); out = intent.getExtras().getString("Key"); } public Bundle getMyData() { Bundle hm = new Bundle(); hm.putString("val1",out); return hm; } } 

А затем в classе fragmentов вы используете getMyData:

 public static class Tab1 extends Fragment { /** * The fragment argument representing the section number for this * fragment. */ public Tab1() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.your_layout_name_for_fragment_1, container, false); TextView output = (TextView)rootView.findViewById(R.id.your_id_for_a_text_view_within_the_layout); MotherActivity activity = (MotherActivity)getActivity(); Bundle results = activity.getMyData(); String value1 = results.getString("val1"); output.setText(value1); return rootView; } } 

Если у вас есть запросы к базе данных, я советую вам сделать их в MotherActivity (и передать их результаты как строки / целые числа, прикрепленные к ключам внутри пакета, как показано выше), как внутри fragmentов с вкладками, ваш синтаксис станет более сложным (это становится getActivity (), и getIntent становится getActivity (). getIntent), но у вас также есть возможность делать то, что вам нужно.

Мой совет для начинающих – сосредоточиться на небольших шагах. Во-первых, получите свое намерение открыть очень простую вкладку, не передавая ЛЮБЫЕ данные. Это работает? Открывает ли он вкладки, которые вы ожидаете? Если нет, то почему?

Начните с этого и, применяя решения, такие как представленные в этом клипе , посмотрите, чего не хватает. Для этого конкретного клипа mainactivity.xml никогда не отображается. Это наверняка смутит вас. Но если вы обратите внимание, вы увидите, что контекст (tools: context) неверен в файлах fragmentа xml. Каждый fragment XML должен указывать на правильный class fragmentа (или подclass с использованием разделителя $).

Вы также увидите, что в главном classе java вам нужно добавить tabLayout.setupWithViewPager (mViewPager) – сразу после строки TabLayout tabLayout = (TabLayout) findViewById (R.id.tabs); без этой строки ваше представление фактически не связано с XML-файлами fragmentов, но оно показывает ТОЛЬКО XML-файл основного действия.

В дополнение к строке основного classа java, в основном файле XML активности вам нужно изменить вкладки в соответствии с вашей ситуацией (например, добавить или удалить TabItems). Если у вас нет вкладок в основном XML активности, то, возможно, вы не выбрали правильный тип активности, когда вы его создали, в первую очередь (новая активность – вкладка).

Обратите внимание, что в последних 3 параграфах я говорю о видео! Поэтому, когда я говорю об основной деятельности XML, это основной вид деятельности XML в видео, который в вашей ситуации является XML-файлом MotherActivity.

Самый умный и проверенный способ передачи данных между fragmentами и активностью – это создание переменных, например:

 class StorageUtil { public static ArrayList employees; } 

Затем, чтобы передать данные из fragmentа в активность, мы делаем это в методе onActivityCreated:

 //a field created in the sending fragment ArrayList employees; @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); employees=new ArrayList(); //java 7 and above syntax for arraylist else use employees=new ArrayList() for java 6 and below //Adding first employee Employee employee=new Employee("1","Andrew","Sam","1984-04-10","Male","Ghanaian"); employees.add(employee); //Adding second employee Employee employee=new Employee("1","Akuah","Morrison","1984-02-04","Female","Ghanaian"); employees.add(employee); StorageUtil.employees=employees; } 

Теперь вы можете получить значение StorageUtil.employees со всего мира. Удачи!

Мое решение состоит в том, чтобы написать статический метод внутри fragmentа:

 public TheFragment setData(TheData data) { TheFragment tf = new TheFragment(); tf.data = data; return tf; } 

Таким образом, я уверен, что все данные, которые мне нужны, находятся внутри fragmentа перед любой другой возможной операцией, которая может потребоваться для работы с ней. На мой взгляд, он выглядит более чистым.

Проверьте этот ответ, если вы хотите передать данные в fragment после его создания. https://stackoverflow.com/a/46467866/1594998

В вашей активности объявите статическую переменную

 public static HashMap contactItems=new HashMap(); 

Затем в вашем fragmentе сделайте так, как следует

 ActivityName.contactItems.put(Number,contactsModal); 
  • Виджеты не реагируют при повторном добавлении кода
  • Firebase перезаписывает подписи с учетной записью Google
  • Добавление Google Cloud Messagin (GCM) для Android - Процесс регистрации
  • Как создать панель пользовательских оценок в Android
  • Android Volley - как изолировать запросы в другом classе
  • Предотrotation HttpClient 4 из следующего перенаправления
  • «Требуется Gradle Version 2.10». Ошибка
  • Уведомление проходит старое задание
  • Как изменить цвет фона вокруг диалогового windows?
  • Как получить количество строк TextView?
  • Как использовать функцию поиска в пользовательском представлении списка в Android
  • Давайте будем гением компьютера.