Надсилайте дані від активності до фрагменту в Android


316

У мене два класи. Перше - це діяльність, друге - фрагмент, де я маю дещо EditText. У своїй діяльності у мене є підклас з async-завданням, і в методі doInBackgroundя отримую певний результат, який я зберігаю до змінної. Як я можу надіслати цю змінну від підкласу "моя діяльність" до цього фрагмента?

Відповіді:


662

З діяльності ви надсилаєте дані з наміром як:

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);
}

15
чи можете ви передати об’єкт фрагменту?
yeahman

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;
    }
}

78
Це рішення інтегрує тісний зв'язок між вашою діяльністю та Fragment, краще використовувати 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");
        ...
        ...
        ...
        }

Я думаю, що це не найкращий підхід для оновлення onQueryTextSubmit-результатів пошуку в ListView, який вкладений у фрагмент (якщо хтось швидко набере, він надсилатиме аргументи двічі на секунду)?
Мартін Пфефер

1
Що з об’єктом, вкладеним рядом або int?
Даріо

2
@Jorgesys Що з цим рішенням? developer.android.com/training/basics/fragments/…
yozhik

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. Ти крутий. ви зробили. ОГО...


15

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

Тож передача даних від A -> F буде такою ж, як пояснила ρяσѕρєя K. Крім цього відповіді, Після створення фрагментів всередині діяльності ми також можемо передавати дані фрагментам методів виклику у фрагментах.

Наприклад:

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


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


що тут R.id.container? Ви мали на увазі R.id.container_current це значення int.
shaurya uppal

@s * R.id.container - це ідентифікатор моєї FrameLayout
Pre_hacker

Поки що найкраще пояснення, яке я коли-небудь знайшов для передачі даних щодо додавання / заміни фрагмента за допомогою диспетчера фрагментів. Працює як дорогоцінний камінь! Дякую!
сам

використано R.id.nav_host_fragment замість R.id.container
Бахаа Хані

10

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

Якщо ви використовуєте фрагмент у класі java, у якому є дані, які ви хочете передати, ви можете застосувати першу відповідь для передачі даних:

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

Якщо ви використовуєте, наприклад, код за замовчуванням, наданий Android Studio для фрагментів з вкладками, цей код не працюватиме.

Він не буде працювати, навіть якщо ви заміните замовчувачFragment за замовчуванням своїм FragmentClasses, і навіть якщо ви виправите FragmentPagerAdapter у новій ситуації, додавши перемикач для getItem () та інший перемикач для getPageTitle () (як показано тут )

Попередження: у вищезазначеному кліпі є помилки в коді, які я поясню пізніше тут, але корисно побачити, як ви переходите від коду за замовчуванням до редагованого коду для фрагментів з вкладками)! Решта моєї відповіді має набагато більше сенсу, якщо ви враховуєте класи java та файли xml із цього кліпу (представницького для першого використання фрагментів з вкладками за початковим сценарієм).

Основна причина, за якою не працює найбільш відповідна відповідь на цій сторінці, - це те, що в цьому коді за замовчуванням для фрагментів на вкладках фрагменти використовуються в іншому класі Java: FragmentPagerAdapter!

Отже, для того, щоб надіслати дані, ви спокушаєтесь створити пакет у програмі MotherActivity і передати їх у FragmentPagerAdapter, використовуючи відповідь №2.

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

Правильний / простіший спосіб зробити це, я думаю, передавати дані безпосередньо у відповідний фрагмент, використовуючи відповідь №2. Так, між діяльністю та фрагментом, АЛЕ, буде встановлено тісний зв'язок для фрагментів з вкладками, що очікується. Я б навіть радив вам створити фрагменти з вкладками всередині ява класу 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 вашої діяльності "Mother" - які ви можете заповнити даними, які ви хочете передати фрагментам, і передати їх через метод, створений після 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 ніколи не відображається. Це, безумовно, збентежить вас. Але якщо ви звернете увагу, ви побачите, що, наприклад, контекст (інструменти: контекст) неправильний у файлах фрагментів 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

Якщо ви передасте посилання на фрагмент (конкретний підклас) для завдання асинхронізації, ви можете отримати доступ до фрагмента безпосередньо.

Деякі способи передачі посилання на фрагмент у завдання async:

  • Якщо ваше завдання асинхронізації є повноцінним класом ( class FooTask extends AsyncTask), тоді передайте свій фрагмент в конструктор.
  • Якщо ваше завдання асинхронізації є внутрішнім класом, просто оголосіть остаточну змінну фрагмента у межах, визначеною завданням async, або як поле зовнішнього класу. Ви зможете отримати доступ до цього з внутрішнього класу.

Ваша відповідь мені здається цілком законною. Чи можете ви трохи розширити, надавши приклад код для виконання?
Леон Армстронг,

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);

5

Дуже старий пост, я все ж наважуюся додати трохи пояснень, які були б мені корисні.

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

Ви можете (якщо вам подобаються експерименти) створити обхід у простих ситуаціях, але підхід у пакеті просто не бачить різниці між одним фрагментом і тисячею у рюкзаку - він залишається простим і зрозумілим.
Ось чому відповідь від @Elenasys - це найелегантніше та універсальне рішення.
І тому відповідь, яку дав @Martin, має підводні камені


4

кращий підхід для передачі даних з класу активності в фрагмент - це проходження методами сетера. Подібно до

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

і отримати ці дані з класу легко.


Як передавати дані з фрагмента в фрагмент, як stackoverflow.com/questions/32953477/pass-data-to-fragment
Hoo

Це не дуже зручно, коли ви також проїжджаєте по іншому, раніше встановленому Екстра
Джерарду

Якщо вам потрібно, щоб ці дані були встановлені на якесь поле у ​​вашому фрагменті, і воно ще не видно (ініціалізовано), ви отримаєте 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

просто натрапили на це питання, тоді як більшість методів, описаних вище, будуть працювати. Я просто хочу додати, що ви можете використовувати бібліотеку шин подій , особливо в сценаріях, де компонент (Діяльність або Фрагмент) не створений, його корисний для всіх розмірів проектів Android та багатьох випадків використання. Я особисто використовував це в декількох проектах, які я маю в playstore.


1

Ви можете створити публічний статичний метод у фрагменті, де ви отримаєте статичну посилання на цей фрагмент, а потім передаєте дані на цю функцію і встановите ці дані для аргументу за тим самим методом і отримаєте дані через getArgument on on create метод фрагмента, і встановіть ці дані на локальну змінні.


1

Найрозумніший перевірений спосіб передачі даних між фрагментами та активністю - це створення змінних, наприклад:

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

Потім, щоб передати дані від фрагмента до активності, ми робимо це в методі onActivityCreate:

//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;
}

Таким чином я впевнений, що всі необхідні мені дані знаходяться всередині Фрагменту перед будь-якою іншою можливою операцією, яка може потребувати роботи з ним. Також на мою думку це виглядає чистіше.


1
Добре, якщо TheData не є безпечним для потоків, зробити його статичним не обов'язково захистить вас від проблем з потоками. Обережно з цим. Статичний характер не є безпечним для ниток.
Мартін Маркончіні

0

Я зіткнувся з подібною проблемою, використовуючи останній компонент архітектури навігації. Випробував увесь вищезгаданий код, передавши пакет від моєї активності дзвінка до Fragment.

Найкращим рішенням, слідуючи останнім тенденціям розвитку Android, є використання View Model (частина Android Jetpack).

Створіть та ініціалізуйте клас ViewModel у батьківській активності. Зауважте, що цей ViewModel повинен бути спільним між активністю та фрагментом.

Тепер усередині фрагмента onViewCreate (), ініціалізуйте той же ViewModel та налаштуйте спостерігачів для прослуховування полів ViewModel.

Ось корисний, поглиблений підручник, якщо вам це потрібно.

https://medium.com/mindorks/how-to-communication-bet between-fragments-and-activity-using-viewmodel-ca733233a51c


-4

У своїй діяльності оголошуйте статичну змінну

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

Тоді у вашому фрагменті роби так, як слід

ActivityName.contactItems.put(Number,contactsModal);

Він буде працювати, але НЕ РЕКОМЕНДУЄМО. Оскільки статичні учасники залишаться в пам’яті, якщо додаток не буде закрито з останніх програм. Тож у такому випадку вам слід використовувати статичний член лише тоді, коли він вам потрібен у багатьох заходах у всьому додатку.
М Шабан Алі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.