Отправить данные из активности на фрагмент в Android

317

У меня есть два класса. Во-первых, это деятельность, во-вторых, фрагмент, где у меня есть некоторые EditText. В действии у меня есть подкласс с асинхронной задачей, и в методе doInBackgroundя получаю некоторый результат, который я сохраняю в переменную. Как я могу отправить эту переменную из подкласса "моя деятельность" в этот фрагмент?

user1302569
источник

Ответы:

663

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

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);
}
ρяσѕρєя K
источник
15
Вы можете передать объект фрагменту?
Да,
63
Хм, я получаю исключение NullPointerException при вызовеgetArguments().getString(key)
Nima G
9
NullPointerException "String strtext setArguments (). GetString (" edttext ");"
Jorgesys
4
При чтении содержимого пакета во фрагменте всегда сначала получите пакет в объект Bundle, используя метод getArguments, и проверьте его на нуль. В противном случае метод getString будет применен к нулю и поэтому к NPE, когда пакет не передается. Это позволит избежать исключений нулевого указателя, когда пакет не передается.
balachandarkm
3
@Aznix. Не рекомендуется создавать конструктор для фрагмента.
Азам
108

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

Деятельность:

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;
    }
}
Ricardas
источник
78
Это решение объединяет тесную связь между вашей деятельностью и фрагментом, лучше использовать Bundleкласс для передачи информации. В качестве альтернативы вы можете сделать этот getMyData()метод унаследованным и реализованным из интерфейса и Fragmentпроверить, возвращает ли getActivity instanceofинтерфейс в onAttach().
Руди Кершоу
1
Это решение лучше для меня. Кроме того, если myString будет общедоступным, вы не объявите метод getMyData ()
Burak Öztürk
1
Текущий принятый ответ возвращает исключение нулевого указателя. Это должен быть принятый ответ
Ричмонд
9
Это не должно быть принятым ответом. Герметичное соединение легко избежать. Это, как правило, плохая идея, и делает этот фрагмент бесполезным, а также может не иметь фрагмента, если вы собираетесь использовать его только в привязке к действию. Фрагмент не может быть повторно использован в других действиях.
Мартин Маркончини
51

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

"Отправка данных от активности к фрагменту в 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();

Фрагмент:

Чтение значения во фрагменте

        @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");
        ...
        ...
        ...
        }
Jorgesys
источник
Я думаю, что это не лучший подход для обновления onQueryTextSubmit-search-results в ListView, который вложен во Fragment (если somybody набирает быстро, он будет посылать аргументы дважды в секунду)?
Мартин Пфеффер
1
Как насчет объекта, введенного из строки или int?
Дарио
2
@Jorgesys Как насчет этого решения? developer.android.com/training/basics/fragments/...
Ёжик
23

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

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

Шаг 1: Создайте интерфейс в Основном действии.

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

Шаг 2. Создайте ссылку SelectedBundle для той же операции

   SelectedBundle selectedBundle;

Шаг 3: создайте метод в той же операции

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

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

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

Шаг 5: моем случае мне нужно передать изображение Uri из HomeActivity во фрагмент. Итак, я использовал эту функциональность в методе onActivityResult.

onActivityResult из MainActivity, передайте значения фрагментам, используя интерфейс.

Примечание: ваш случай может быть другим. Вы можете позвонить из любого места из вашей HomeActivity.

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

Вот и все. Реализуйте каждый фрагмент, который вам нужен, в FragmentClass. Ты замечательный. ты сделал. ВОТ ЭТО ДА...

Noorul
источник
15

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

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

Например:

    ArticleFragment articleFrag = (ArticleFragment)
                    getSupportFragmentManager().findFragmentById(R.id.article_fragment);
    articleFrag.updateArticleView(position);
diyoda_
источник
Доказательство: developer.android.com/training/basics/fragments/...
Ёжик
15

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

Например: если ваш фрагмент называется MyFragment

так что вы будете называть свой фрагмент из активности следующим образом:

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

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

поэтому в MyFragment.newInstance («data1», «data2») вы можете отправлять данные во фрагмент, а в своем фрагменте вы получаете эти данные в 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 вы получите данные:

@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 в своем фрагменте.

Pre_hacker
источник
что такое R.id.container здесь? Вы имели в виду R.id.container_current, это значение типа int.
Shaurya Uppal
@s * R.id.container - это идентификатор моего FrameLayout
Pre_hacker,
На сегодняшний день лучшее объяснение, которое я когда-либо нашел, - передать данные по фрагменту добавления / замены с помощью Fragment Manager. Работает как драгоценный камень! Спасибо!
Сэм
используется R.id.nav_host_fragment вместо R.id.container
Bahaa Хани
10

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

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

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

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

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

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

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

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

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

Я думаю, что правильный / более простой способ сделать это - передать данные непосредственно в рассматриваемый фрагмент, используя ответ № 2. Да, между фрагментами с вкладками будет тесная связь между заданием и фрагментом, но это своего рода ожидание. Я бы даже посоветовал вам создать фрагменты с вкладками внутри Java-класса MotherActivity (в виде подклассов, так как они никогда не будут использоваться вне MotherActivity) - это просто, просто добавьте в Java-класс MotherActivity столько фрагментов, сколько вам нужно, вот так:

 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 в такой фрагмент, вам нужно создать частные строки / связки выше onCreate вашей материнской активности, которые вы можете заполнить данными, которые хотите передать во фрагменты, и передать их через метод, созданный после 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;
    }
}

И затем в классе фрагмента вы используете 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 (и передавать их результаты в виде строк / целых чисел, прикрепленных к ключам внутри пакета, как показано выше), так как внутри фрагментов с вкладками ваш синтаксис станет более сложным (это становится 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.

Адриан Стойка
источник
8

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

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

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

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

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

В вашем фрагменте 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);
fralbo
источник
5

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

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

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

sberezin
источник
4

лучший подход для отправки данных из класса активности во фрагмент - передача через методы установки. подобно

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

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

ГНУ-Anik
источник
Как передать данные от фрагмента к фрагменту, например stackoverflow.com/questions/32953477/pass-data-to-fragment
Hoo
Это не очень удобно, когда вы проходите мимо других, ранее установленных Extra
Gerard
Если вам нужно, чтобы эти данные были установлены в какое-то поле в вашем фрагменте, и они еще не видны (инициализированы), вы получите NPE.
Ёжик
Я перестал работать с Android, вероятно, 3 года назад, эти вещи могут быть устаревшими в эти дни.
ssi-anik
4

От Activityвас отправляют данные с 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);
}
Виджай
источник
3

Если после инициализации activityнеобходимо 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.


источник
1
это действительно хорошо, в том смысле, что вы не хотите вводить onCreateViewметод во фрагменте. был действительно полезен
Молодой Эмиль
2

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

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

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

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

метод фрагментации

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

вы можете привести свой контекст GenericConnectorв onAttach(Context)слишком

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

CustomValueDialogFragment.show(this);

в вашем фрагменте

...
@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();способ.

Камар
источник
2

только что наткнулся на этот вопрос, в то время как большинство методов, описанных выше, будут работать. Я просто хочу добавить, что вы можете использовать библиотеку Event Bus , особенно в тех случаях, когда компонент (Activity или Fragment) не был создан, он подходит для всех размеров проектов android и многих вариантов использования. Я лично использовал его в нескольких проектах на PlayStore.

Джошуа Маджеби
источник
1

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

M.Noman
источник
1

Самый разумный и проверенный способ передачи данных между фрагментами и действиями - это создание переменных, например:

class StorageUtil {
  public static ArrayList<Employee> employees;
}

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

//a field created in the sending fragment
ArrayList<Employee> 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<Employee>() 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 отовсюду. Удачи!

Эндрю Сэм
источник
0

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

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

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

Matteo
источник
1
Что ж, если TheData не является потокобезопасным, то его статичность не обязательно защитит вас от проблем с потоками. Осторожнее с этим. Статика не является потокобезопасной по своей природе.
Мартин Маркончини,
0

Я столкнулся с аналогичной проблемой при использовании новейшего компонента архитектуры навигации. Перепробовал весь вышеупомянутый код с передачей пакета из моей деятельности по вызову во 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

devDeejay
источник
-4

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

public static HashMap<String,ContactsModal> contactItems=new HashMap<String, ContactsModal>();

Тогда в вашем фрагменте сделайте как следует

ActivityName.contactItems.put(Number,contactsModal);
Dv Keerthi
источник
Это будет работать, но НЕ РЕКОМЕНДУЕТСЯ. Как статические члены останутся в памяти, если приложение не будет принудительно закрыто из-за недавних приложений. Так что в таком случае вы должны использовать статический член только тогда, когда он вам нужен во многих действиях в приложении.
М Шабан Али