Базовая связь между двумя фрагментами

У меня есть одно activity - MainActivity . Внутри этой Activity меня есть два fragments , оба из которых я создал декларативно внутри xml.

Я пытаюсь передать String ввода текста пользователем в Fragment A в текстовое представление в Fragment B Однако это очень сложно. Кто-нибудь знает, как я могу это достичь?

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

Solutions Collecting From Web of "Базовая связь между двумя фрагментами"

Взгляните на страницу девелоперов Android: http://developer.android.com/training/basics/fragments/communicating.html#DefineInterface

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

 // You Activity implements your interface public class YourActivity implements FragmentA.TextClicked{ @Override public void sendText(String text){ // Get Fragment B FraB frag = (FragB) getSupportFragmentManager().findFragmentById(R.id.fragment_b); frag.updateText(text); } } // Fragment A defines an Interface, and calls the method when needed public class FragA extends Fragment{ TextClicked mCallback; public interface TextClicked{ public void sendText(String text); } @Override public void onAttach(Activity activity) { super.onAttach(activity); // This makes sure that the container activity has implemented // the callback interface. If not, it throws an exception try { mCallback = (TextClicked) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement TextClicked"); } } public void someMethod(){ mCallback.sendText("YOUR TEXT"); } @Override public void onDetach() { mCallback = null; // => avoid leaking, thanks @Deepscorn super.onDetach(); } } // Fragment B has a public method to do something with the text public class FragB extends Fragment{ public void updateText(String text){ // Here you have it } } 

Рассмотрим мои 2 фрагмента A и B и предположим, что мне нужно передать данные из B в A.

Затем создайте интерфейс в B и передайте данные в основную активность. Там создается другой интерфейс и передаются данные фрагменту A.

Разделив небольшой пример:

Фрагмент A выглядит

 public class FragmentA extends Fragment implements InterfaceDataCommunicatorFromActivity { public InterfaceDataCommunicatorFromActivity interfaceDataCommunicatorFromActivity; String data; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub return super.onCreateView(inflater, container, savedInstanceState); } @Override public void updateData(String data) { // TODO Auto-generated method stub this.data = data; //data is updated here which is from fragment B } @Override public void onAttach(Activity activity) { // TODO Auto-generated method stub super.onAttach(activity); try { interfaceDataCommunicatorFromActivity = (InterfaceDataCommunicatorFromActivity) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement TextClicked"); } } } 

FragmentB выглядит как

 class FragmentB extends Fragment { public InterfaceDataCommunicator interfaceDataCommunicator; @Override public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); // call this inorder to send Data to interface interfaceDataCommunicator.updateData("data"); } public interface InterfaceDataCommunicator { public void updateData(String data); } @Override public void onAttach(Activity activity) { // TODO Auto-generated method stub super.onAttach(activity); try { interfaceDataCommunicator = (InterfaceDataCommunicator) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement TextClicked"); } } } 

Основная деятельность

 public class MainActivity extends Activity implements InterfaceDataCommunicator { public InterfaceDataCommunicatorFromActivity interfaceDataCommunicatorFromActivity; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public void updateData(String data) { // TODO Auto-generated method stub interfaceDataCommunicatorFromActivity.updateData(data); } public interface InterfaceDataCommunicatorFromActivity { public void updateData(String data); } } 

Обновить

Игнорируйте этот ответ. Не то, чтобы это не сработало. Но есть лучшие методы. Более того, Android решительно препятствует прямой связи между фрагментами. См. Официальный документ . Спасибо пользователю @Wahib Ul Haq за подсказку.

Оригинальный ответ

Ну, вы можете создать частную переменную и setter в Fragment B и установить значение из самого фрагмента A,

FragmentB.java

 private String inputString; .... .... public void setInputString(String string){ inputString = string; } 

FragmentA.java

 //go to fragment B FragmentB frag = new FragmentB(); frag.setInputString(YOUR_STRING); //create your fragment transaction object, set animation etc fragTrans.replace(ITS_ARGUMENTS) 

Или вы можете использовать Activity, как вам было предложено.

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

https://github.com/bitsabhi/DemoFragmentCommunications

Недавно я создал библиотеку, в которой используются аннотации, чтобы сгенерировать для вас шаблон шаблонов кастомизации типов. https://github.com/zeroarst/callbackfragment

Вот пример. Нажмите TextView на DialogFragment чтобы MainActivity обратный вызов MainActivity в onTextClicked затем захватить экземпляр MyFagment для взаимодействия.

 public class MainActivity extends AppCompatActivity implements MyFragment.FragmentCallback, MyDialogFragment.DialogListener { private static final String MY_FRAGM = "MY_FRAGMENT"; private static final String MY_DIALOG_FRAGM = "MY_DIALOG_FRAGMENT"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getSupportFragmentManager().beginTransaction() .add(R.id.lo_fragm_container, MyFragmentCallbackable.create(), MY_FRAGM) .commit(); findViewById(R.id.bt).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { MyDialogFragmentCallbackable.create().show(getSupportFragmentManager(), MY_DIALOG_FRAGM); } }); } Toast mToast; @Override public void onClickButton(MyFragment fragment) { if (mToast != null) mToast.cancel(); mToast = Toast.makeText(this, "Callback from " + fragment.getTag() + " to " + this.getClass().getSimpleName(), Toast.LENGTH_SHORT); mToast.show(); } @Override public void onTextClicked(MyDialogFragment fragment) { MyFragment myFragm = (MyFragment) getSupportFragmentManager().findFragmentByTag(MY_FRAGM); if (myFragm != null) { myFragm.updateText("Callback from " + fragment.getTag() + " to " + myFragm.getTag()); } } 

}