Як передавати дані між фрагментами


78

Я намагаюся передавати дані між двома фрагментами в моїй програмі. Це просто простий рядок, який зберігається у списку. Список робиться загальнодоступним у фрагментах A, і коли користувач натискає елемент списку, він потрібен для відображення у фрагменті B. Постачальник вмісту, схоже, підтримує лише ідентифікатори, тому це не буде працювати. Будь-які пропозиції?



Відповіді:


22

Чому б вам не використовувати Пакет. Ось як налаштувати його з першого фрагмента:

Fragment fragment = new Fragment();
Bundle bundle = new Bundle();
bundle.putInt(key, value);
fragment.setArguments(bundle);

Потім у другому фрагменті отримайте дані за допомогою:

Bundle bundle = this.getArguments();
int myInt = bundle.getInt(key, defaultValue);

Bundle застосував методи для безлічі типів даних. Будь ласка, див. Http://developer.android.com/reference/android/os/Bundle.html


21

Якщо ви використовуєте Roboguice, ви можете використовувати EventManager в Roboguice для передачі даних, не використовуючи Activity як інтерфейс. Це досить чисте IMO.

Якщо ви не використовуєте Roboguice, ви також можете використовувати Отто як шину подій: http://square.github.com/otto/

Оновлення 20150909: Ви також можете зараз використовувати Green Robot Event Bus або навіть RxJava. Залежить від вашого випадку використання.


3
Я від усієї душі відстоюю те, що тут говорить Донн. Використовуйте автобус і розплутуйте все це і припиніть писати слухачі та зворотні дзвінки вручну. Отто FTW.
Чарлі Коллінз,

Якщо ви не хочете використовувати RoboGuice, ви можете використовувати Otto by Square. Зараз я досить багато використовую Отто та його ДИВНО. github.com/square/otto
Донн Фелкер,

9
Якщо вам подобається Otto, ви можете також оцінити EventBus, який додатково пропонує обробку потоків. github.com/greenrobot/EventBus
Маркус

4
Я бачу, як працює стратегія шини подій, якщо обидва фрагменти видно одночасно, але як би це працювало, якщо Фрагмент A (припустимо, це ListFragment) займає весь екран, а вибір елемента Списку запускає Fragment B, який також бере на весь екран. AFAIK, у шаблоні шини подій кожен фрагмент реєструється / скасовується реєстрація в onResume / onPause, тому я не впевнений, як би я застосував це.
Matt

@Matthew, якщо це так, вам доведеться передавати їх у пакети між діями, які потім можуть вводити дані в них під час виконання.
Донн Фелкер,

17

З Fragment документації :

Часто вам потрібно, щоб один фрагмент спілкувався з іншим, наприклад, щоб змінити вміст на основі події користувача. Усі зв’язки фрагмента до фрагмента здійснюються за допомогою пов’язаної діяльності. Два фрагменти ніколи не повинні спілкуватися безпосередньо.

Тому я пропоную вам поглянути на основні навчальні документи щодо фрагментів у документації. Вони досить вичерпні з прикладом та покроковим керівництвом.


12

Отже, скажімо, у вас є Activity AB, яка контролює Frag A та Fragment B. Усередині Fragment A вам потрібен інтерфейс, який Activity AB може реалізувати. У зразку коду Android вони мають:

private Callbacks mCallbacks = sDummyCallbacks;

/ * Інтерфейс зворотного виклику, який повинні виконувати всі дії, що містять цей фрагмент. Цей механізм дозволяє повідомляти про діяльність щодо вибору товару. * /

public interface Callbacks {
/*Callback for when an item has been selected. */    
      public void onItemSelected(String id);
}

/*A dummy implementation of the {@link Callbacks} interface that does nothing. Used only when this fragment is not attached to an activity. */    
private static Callbacks sDummyCallbacks = new Callbacks() {
    @Override
    public void onItemSelected(String id) {
    }
};

Інтерфейс зворотного виклику розміщений всередині одного з ваших фрагментів (скажімо, фрагмент A). Я думаю, що мета цього інтерфейсу Callbacks схожа на вкладений клас всередині Frag A, який може реалізувати будь-яка діяльність. Отже, якщо фрагмент A був телевізором, CallBacks - це пульт дистанційного керування телевізором (інтерфейс), який дозволяє використовувати фрагмент A Activity AB. Можливо, я помиляюся в деталях, тому що я нуб, але я отримав, щоб моя програма працювала ідеально на всіх розмірах екрану, і саме цим я користувався.

Отже, всередині Фрагменту А ми маємо: (Я взяв це із зразків програм Android)

@Override
public void onListItemClick(ListView listView, View view, int position, long id) {
super.onListItemClick(listView, view, position, id);
// Notify the active callbacks interface (the activity, if the
// fragment is attached to one) that an item has been selected.
mCallbacks.onItemSelected(DummyContent.ITEMS.get(position).id);
//mCallbacks.onItemSelected( PUT YOUR SHIT HERE. int, String, etc.);
//mCallbacks.onItemSelected (Object);
}

А всередині Activity AB ми перевизначаємо метод onItemSelected:

public class AB extends FragmentActivity implements ItemListFragment.Callbacks {
//...
@Override
//public void onItemSelected (CATCH YOUR SHIT HERE) {
//public void onItemSelected (Object obj) {
    public void onItemSelected(String id) {
    //Pass Data to Fragment B. For example:
    Bundle arguments = new Bundle();
    arguments.putString(“FragmentB_package”, id);
    FragmentB fragment = new FragmentB();
    fragment.setArguments(arguments);
    getSupportFragmentManager().beginTransaction().replace(R.id.item_detail_container, fragment).commit();
    }

Отже, всередині Activity AB ви в основному кидаєте все в Пачку та передаєте Б. Якщо Ви не знаєте, як користуватися Пачкою, знайдіть клас.

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


8

1- Перший спосіб - це визначення інтерфейсу

public interface OnMessage{
    void sendMessage(int fragmentId, String message);
}

public interface OnReceive{
    void onReceive(String message);
}

2- У вашій діяльності реалізуйте інтерфейс OnMessage

public class MyActivity implements OnMessage {
   ...
   @Override
   public void sendMessage(int fragmentId, String message){
       Fragment fragment = getSupportFragmentManager().findFragmentById(fragmentId);
       ((OnReceive) fragment).sendMessage();
   }
}

3- У своєму фрагменті реалізуйте інтерфейс OnReceive

public class MyFragment implements OnReceive{
    ...
    @Override
    public void onReceive(String message){
        myTextView.setText("Received message:" + message);
    }
}

Це шаблонна версія обробки повідомлень, що передаються між фрагментами.

Інший спосіб передачі даних між фрагментами - використання шини подій.

1- Реєстрація / скасування реєстрації на шині події

@Override
public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}

@Override
public void onStop() {
    EventBus.getDefault().unregister(this);
    super.onStop();
}

2- Визначте клас події

public class Message{
    public final String message;

    public Message(String message){
        this.message = message;
    }
}

3- Розмістіть цю подію в будь-якому місці вашої програми

EventBus.getDefault().post(new Message("hello world"));

4- Підпишіться на цю подію, щоб отримати її у своєму Фрагменті

@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessage(Message event){
    mytextview.setText(event.message);
}

Для отримання детальної інформації використовуйте приклади використання та приклад проекту щодо шаблону шини подій.


Будь ласка , не публікуйте однакові відповіді на кілька запитань . Опублікуйте одну хорошу відповідь, потім проголосуйте / позначте, щоб закрити інші запитання як дублікати. Якщо питання не є дублікатом, адаптуйте відповіді на запитання .
Мартін Пітерс

3

У моєму випадку мені довелося відправляти дані назад з FragmentB-> FragmentA, отже, Intents не було варіантом, оскільки фрагмент вже був би ініціалізований. Хоча всі наведені вище відповіді звучать добре, для реалізації потрібно багато кодової таблички , тому я пішов із набагато простішим підходом до використання LocalBroadcastManager , він точно робить вищезазначене, але без Alll неприємний шаблонний код. Нижче наведено приклад.

Під час надсилання фрагмента (фрагмент B)

public class FragmentB {

    private void sendMessage() {
      Intent intent = new Intent("custom-event-name");
      intent.putExtra("message", "your message");
      LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
    }
 }

І у фрагменті повідомлення, яке потрібно отримати (ФРАГМЕНТ А)

  public class FragmentA {
    @Override
    public void onCreate(Bundle savedInstanceState) {

      ...

      // Register receiver
      LocalBroadcastManager.getInstance(this).registerReceiver(receiver,
          new IntentFilter("custom-event-name"));
    }

//    This will be called whenever an Intent with an action named "custom-event-name" is broadcasted.
    private BroadcastReceiver receiver = new BroadcastReceiver() {
      @Override
      public void onReceive(Context context, Intent intent) {
        String message = intent.getStringExtra("message");
      }
    };
}

Сподіваюся, це комусь допомагає


отже, я використав цей код, і здається, що onReceive викликається двічі, немає ідеї чому.
SolidSnake

ну ніколи не реєструйтеReciver усередині фрагмента, оскільки він буде чомусь зареєстрований двічі
SolidSnake

2

Це залежить від структури фрагмента. Якщо у вас є деякі методи на статичному фрагменті класу B, а також статичний об'єкт TextView, ви можете викликати метод безпосередньо на класовому фрагменті А. Це краще, ніж слухач, оскільки метод виконується миттєво, і ми не ' t потрібно мати додаткове завдання, яке виконує прослуховування протягом усього заняття. Дивіться приклад нижче:

Fragment_class_B.setmyText(String yourstring);

На фрагменті B метод може бути визначений як:

public static void setmyText(final String string) {
myTextView.setText(string);
}

Тільки не забудьте встановити myTextView як статичний для фрагмента B і правильно імпортувати клас Fragment B для фрагмента A.

Просто нещодавно зробив процедуру для мого проекту, і вона спрацювала. Сподіваюся, це допомогло.


2
Це буде працювати (добре, поки фрагмент не буде знищений і відтворений, подумайте про обертання пристрою), але ви щільно зв’язуєте фрагменти; залежний фрагмент (назвемо його "X") має в своєму коді жорстку залежність від іншого фрагмента ("Y"). Перехід через батьківську діяльність є набагато акуратнішим, оскільки ви можете залишити це завдання вирішувати, звідки брати дані. Наприклад, на телефоні у вашій діяльності можуть використовуватися фрагменти X і Y, але на планшеті ви можете вирішити використовувати X і Z. Краще дозволити Activity (який знає, які фрагменти існують) діяти як середній чоловік і підключатися до Y або Z як доречно.
Phil Haigh

як щодо цього викликати Асинтаск за цим методом
UnderGround

1

Ви можете прочитати цей документ. Ця концепція добре пояснена тут http://developer.android.com/training/basics/fragments/communicating.html


будь ласка, використовуйте коментарі до запитання, замість того, щоб розміщувати відповідь, якщо ви посилаєтесь лише на іншу URL-адресу
Jens Wirth,

Хоча це посилання може відповісти на питання, краще включити сюди основні частини відповіді та надати посилання для довідки. Відповіді лише на посилання можуть стати недійсними, якщо пов’язана сторінка зміниться.
Мез

Це не дає відповіді на запитання. Щоб критикувати або вимагати роз’яснень від автора, залиште коментар під його публікацією - ви завжди можете коментувати власні публікації, і коли у вас буде достатня репутація, ви зможете коментувати будь-яку публікацію .
bartektartanus

@Mez Я погоджуюсь з твоїми словами. І спробую зробити те саме наступного разу.
Nikhil

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

1

Я працюю над подібним проектом, і, мабуть, мій код може допомогти у вищезазначеній ситуації

Ось огляд того, що я роблю

У моєму проекті є два фрагменти, які називаються " FragmentA " і "FragmentB "

- FragmentA Містить один перегляд списку, коли ви клацаєте елемент у FragmentA It INDEX передається FragmentB за допомогою інтерфейсу Communicator

  • Шаблон проекту повністю заснований на концепції інтерфейсів Java, яка говорить, що " посилальні змінні інтерфейсу можуть посилатися на об'єкт підкласу"
  • Нехай MainActivity реалізує інтерфейс, наданий fragmentA (інакше ми не можемо зробити посилальну змінну інтерфейсу, щоб вказувати на MainActivity)
  • У наведеному нижче коді об'єкт комунікатора зроблений для посилання на об'єкт MainActivity за допомогою методу " setCommunicator (Communicatot c) ", присутнього у фрагментіA .
  • Я запускаю метод response () інтерфейсу від FrgamentA, використовуючи посилання MainActivity.

    Інтерфейс комунікатора визначений всередині фрагментаA, це для забезпечення найменшого доступу до інтерфейсу комунікатора .

нижче мій повний робочий код

ФрагментA.java

public class FragmentA extends Fragment implements OnItemClickListener {

ListView list;
Communicator communicater;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    return inflater.inflate(R.layout.fragmenta, container,false);
}

public void setCommunicator(Communicator c){
    communicater=c;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onActivityCreated(savedInstanceState);
    communicater=(Communicator) getActivity();
    list = (ListView) getActivity().findViewById(R.id.lvModularListView);
    ArrayAdapter<?> adapter = ArrayAdapter.createFromResource(getActivity(),
            R.array.items, android.R.layout.simple_list_item_1);
    list.setAdapter(adapter);
    list.setOnItemClickListener(this);

}

@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int index, long arg3) {
communicater.respond(index);

}

public interface Communicator{
    public void respond(int index);
}

}

фрагментB.java

public class FragmentA extends Fragment implements OnItemClickListener {

ListView list;
Communicator communicater;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    return inflater.inflate(R.layout.fragmenta, container,false);
}

public void setCommunicator(Communicator c){
    communicater=c;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onActivityCreated(savedInstanceState);
    communicater=(Communicator) getActivity();
    list = (ListView) getActivity().findViewById(R.id.lvModularListView);
    ArrayAdapter<?> adapter = ArrayAdapter.createFromResource(getActivity(),
            R.array.items, android.R.layout.simple_list_item_1);
    list.setAdapter(adapter);
    list.setOnItemClickListener(this);

}

@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int index, long arg3) {
communicater.respond(index);

}

public interface Communicator{
    public void respond(int index);
}

}

MainActivity.java

public class MainActivity extends Activity implements FragmentA.Communicator {
FragmentManager manager=getFragmentManager();
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    FragmentA fragA=(FragmentA) manager.findFragmentById(R.id.fragmenta);
    fragA.setCommunicator(this);


}

@Override
public void respond(int i) {
    // TODO Auto-generated method stub

FragmentB FragB=(FragmentB) manager.findFragmentById(R.id.fragmentb);
FragB.changetext(i);
}



}

Опублікований код FragmentB такий самий, як FragmentA. Будь ласка, виправте. Дякую.
Marka A

1

В основному реалізуйте інтерфейс для зв'язку між активністю та фрагментом.

1) Основна діяльність

public class MainActivity extends Activity implements SendFragment.StartCommunication
{

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

@Override
public void setComm(String msg) {
// TODO Auto-generated method stub
DisplayFragment mDisplayFragment = (DisplayFragment)getFragmentManager().findFragmentById(R.id.fragment2);
if(mDisplayFragment != null && mDisplayFragment.isInLayout())
{
mDisplayFragment.setText(msg);
}
else
{
Toast.makeText(this, "Error Sending Message", Toast.LENGTH_SHORT).show();
}
}
}

2) фрагмент відправника (fragment-to-Activity)

public class SendFragment extends Fragment
{
StartCommunication mStartCommunicationListner;
String msg = "hi";
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View mView = (View) inflater.inflate(R.layout.send_fragment, container);
final EditText mEditText = (EditText)mView.findViewById(R.id.editText1);
Button mButton = (Button) mView.findViewById(R.id.button1);
mButton.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
msg = mEditText.getText().toString();
sendMessage();
}
});
return mView;
}

interface StartCommunication
{
public void setComm(String msg);
}

@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
if(activity instanceof StartCommunication)
{
mStartCommunicationListner = (StartCommunication)activity;
}
else
throw new ClassCastException();

}

public void sendMessage()
{
mStartCommunicationListner.setComm(msg);
}

}

3) фрагмент приймача (Activity-to-fragment)

    public class DisplayFragment extends Fragment
{
View mView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
mView = (View) inflater.inflate(R.layout.display_frgmt_layout, container);
return mView;
}

void setText(String msg)
{
TextView mTextView = (TextView) mView.findViewById(R.id.textView1);
mTextView.setText(msg);
}

}

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

http://infobloggall.com/2014/06/22/communication-between-activity-and-fragments/


Хоча це посилання може відповісти на питання, краще включити сюди основні частини відповіді та надати посилання для довідки. Відповіді лише на посилання можуть стати недійсними, якщо сторінка, на яку посилається, зміниться
abarisone

0

Клас фрагментів А

public class CountryListFragment extends ListFragment{

    /** List of countries to be displayed in the ListFragment */

    ListFragmentItemClickListener ifaceItemClickListener;   

    /** An interface for defining the callback method */
    public interface ListFragmentItemClickListener {
    /** This method will be invoked when an item in the ListFragment is clicked */
    void onListFragmentItemClick(int position);
}   

/** A callback function, executed when this fragment is attached to an activity */  
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    try{
        /** This statement ensures that the hosting activity implements ListFragmentItemClickListener */
        ifaceItemClickListener = (ListFragmentItemClickListener) activity;          
    }catch(Exception e){
        Toast.makeText(activity.getBaseContext(), "Exception",Toast.LENGTH_SHORT).show();
    }
}

Фрагмент класу B

public class CountryDetailsFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    /** Inflating the layout country_details_fragment_layout to the view object v */
    View v = inflater.inflate(R.layout.country_details_fragment_layout, null);

    /** Getting the textview object of the layout to set the details */ 
    TextView tv = (TextView) v.findViewById(R.id.country_details);      

    /** Getting the bundle object passed from MainActivity ( in Landscape   mode )  or from 
     *  CountryDetailsActivity ( in Portrait Mode )  
     * */
    Bundle b = getArguments();

    /** Getting the clicked item's position and setting corresponding  details in the textview of the detailed fragment */
    tv.setText("Details of " + Country.name[b.getInt("position")]);     

    return v;
    }

}

Основний клас діяльності для передачі даних між фрагментами

public class MainActivity extends Activity implements ListFragmentItemClickListener {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}


/** This method will be executed when the user clicks on an item in the listview */
@Override
public void onListFragmentItemClick(int position) {

    /** Getting the orientation ( Landscape or Portrait ) of the screen */
    int orientation = getResources().getConfiguration().orientation;


    /** Landscape Mode */
    if(orientation == Configuration.ORIENTATION_LANDSCAPE ){
        /** Getting the fragment manager for fragment related operations */
        FragmentManager fragmentManager = getFragmentManager();

        /** Getting the fragmenttransaction object, which can be used to add, remove or replace a fragment */
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        /** Getting the existing detailed fragment object, if it already exists. 
         *  The fragment object is retrieved by its tag name  *
         */
Fragment prevFrag = fragmentManager.findFragmentByTag("in.wptrafficanalyzer.country.details");

        /** Remove the existing detailed fragment object if it exists */
        if(prevFrag!=null)
    fragmentTransaction.remove(prevFrag);           

        /** Instantiating the fragment CountryDetailsFragment */
  CountryDetailsFragment fragment = new CountryDetailsFragment();

        /** Creating a bundle object to pass the data(the clicked item's   position) from the activity to the fragment */ 
        Bundle b = new Bundle();

        /** Setting the data to the bundle object */
        b.putInt("position", position);

        /** Setting the bundle object to the fragment */
        fragment.setArguments(b);           

        /** Adding the fragment to the fragment transaction */
        fragmentTransaction.add(R.id.detail_fragment_container,   fragment,"in.wptrafficanalyzer.country.details");

        /** Adding this transaction to backstack */
        fragmentTransaction.addToBackStack(null);

        /** Making this transaction in effect */
        fragmentTransaction.commit();

    }else{          /** Portrait Mode or Square mode */
        /** Creating an intent object to start the CountryDetailsActivity */
        Intent intent = new Intent("in.wptrafficanalyzer.CountryDetailsActivity");

        /** Setting data ( the clicked item's position ) to this intent */
        intent.putExtra("position", position);

        /** Starting the activity by passing the implicit intent */
        startActivity(intent);          
      }
    }
 }

Детальний клас активності

public class CountryDetailsActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    /** Setting the layout for this activity */
    setContentView(R.layout.country_details_activity_layout);

    /** Getting the fragment manager for fragment related operations */
    FragmentManager fragmentManager = getFragmentManager();

    /** Getting the fragmenttransaction object, which can be used to add, remove or replace a fragment */
    FragmentTransaction fragmentTransacton = fragmentManager.beginTransaction();

    /** Instantiating the fragment CountryDetailsFragment */
    CountryDetailsFragment detailsFragment = new CountryDetailsFragment();

    /** Creating a bundle object to pass the data(the clicked item's position) from the activity to the fragment */
    Bundle b = new Bundle();

    /** Setting the data to the bundle object from the Intent*/
    b.putInt("position", getIntent().getIntExtra("position", 0));

    /** Setting the bundle object to the fragment */
    detailsFragment.setArguments(b);

    /** Adding the fragment to the fragment transaction */
    fragmentTransacton.add(R.id.country_details_fragment_container, detailsFragment);       

    /** Making this transaction in effect */
    fragmentTransacton.commit();

    }
}

Масив Contries

public class Country {

/** Array of countries used to display in CountryListFragment */
static String name[] = new String[] {
        "India",
        "Pakistan",
        "Sri Lanka",
        "China",
        "Bangladesh",
        "Nepal",
        "Afghanistan",
        "North Korea",
        "South Korea",
        "Japan",
        "Bhutan"
};
}

Для отримання детальної інформації відвідайте це посилання [ http://wptrafficanalyzer.in/blog/itemclick-handler-for-listfragment-in-android/] . Є повний приклад ..


0

getParentFragmentManager().setFragmentResultListenerце спосіб 2020 року зробити це. Ваше єдине обмеження - використовувати пакет для передачі даних. Перегляньте документи, щоб отримати додаткову інформацію та приклади.

Деякі інші способи

  • Зателефонуйте getActivity()та передайте його спільній діяльності між вашими фрагментами, а потім використовуйте як міст для передачі даних. Це рішення настійно не рекомендується через купелювання, яке воно вимагає між діяльністю та фрагментами, але раніше це було популярним способом робити це ще за часів KitKat ...
  • Використовуйте зворотні дзвінки. Будь-який механізм подій підійде. Це було б ванільне рішення Java. Перевага в FragmentManagerтому, що це не обмежується лише пакетами. Однак недоліком є ​​те, що ви можете зіткнутися з помилками крайових випадків, коли ви зіпсуєте життєвий цикл діяльності та отримаєте винятки, наприклад, IllegalStateExceptionколи менеджер фрагментів знаходиться в середині стану збереження або діяльність була знищена. Крім того, він не підтримує взаємодію з перехресною обробкою.

-2

В основному тут ми маємо справу зі спілкуванням між Фрагментами. Зв'язок між фрагментами ніколи не може бути безпосередньо можливим. Він передбачає діяльність, в контексті якої створюються обидва фрагменти.

Вам потрібно створити інтерфейс у відправляючому фрагменті та впровадити інтерфейс у дії, яка буде відновлювати повідомлення та переносити до отримуючого фрагмента.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.