Как передать результат из второго фрагмента в первый фрагмент
В моем приложении у меня есть два фрагмента: фрагмент и FragmentB. Когда я нажимаю кнопку в fragmetA, список открывается в фрагментеB. Теперь, когда я выбираю элемент из списка в fragmentB, я хочу, чтобы результат был передан фрагменту. Я использую только одну TabActivity для всех фрагментов. Когда элемент списка выбран в фрагментB, я выхожу из fragmentB из стека, чтобы сразу вернуться к фрагменту.
Кто-нибудь знает, как передать результат предыдущему фрагменту.
Спасибо.
Ответы
Ответ 1
Обновление
Activity является родительским контроллером и должна нести ответственность за обработку событий, вызванных его фрагментами/представлениями, которые касаются чего-то, выходящего за рамки самого фрагмента/представления.
Фрагмент должен действовать как субконтроллер видов, в которых он размещен. Со всеми событиями и связями между своими взглядами фрагмент должен справиться сам. Когда есть событие вне области действия и ответственности фрагмента (например, отправка данных в другой фрагмент), это событие должно быть передано его родительскому контроллеру Activity.
![enter image description here]()
Старый
Из этого урока: http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity
Лучше позволить действию применить изменения к своему фрагменту, чем передавать значения непосредственно между фрагментами. Пусть ваша деятельность реализует интерфейс FragmentListener
с методами onQuery(Bundle data)
и onResult(Bundle data)
.
Создайте FragmentListener
переменную в каждом из ваших фрагментов, а затем переопределите onAttach()
каждого фрагмента следующим образом:
public void onAttach(Activity activity) {
super.onAttach(activity);
//---register parent activity for events---
try{
fragmentListener = (FragmentListener) activity;
}catch (ClassCastException e)
{
throw new ClassCastException("Parent activity must implement interface FragmentListener.");
}
}
Это заставит ваши дочерние фрагменты автоматически регистрироваться в родительском Activity.
Также не забудьте опубликовать ссылку fragmentListener
в onDetach()
.
Теперь вы можете называть свою активность из фрагментов.
С другой стороны, ваша активность всегда может искать фрагмент, используя getFragmentManager().findFragmentByTag("fragmentA")
или findFragmentById("FragmentA")
.
Если он может найти ваш Фрагмент, то он может привести его к вашему классу FragmentA
и вызвать его методы. То же самое можно сделать с FragmentB
или любым другим фрагментом.
Ответ 2
Одно из возможных решений:
public class DetachableResultReceiver extends ResultReceiver {
private Receiver mReceiver;
public DetachableResultReceiver(Handler handler) {
super(handler);
}
public void clearReceiver() {
mReceiver = null;
}
public void setReceiver(Receiver receiver) {
mReceiver = receiver;
}
public interface Receiver {
public void onReceiveResult(int resultCode, Bundle resultData);
}
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
if (mReceiver != null) {
mReceiver.onReceiveResult(resultCode, resultData);
}
}
}
Первый фрагмент реализует DetachableResultReceiver.Receiver и создает объект DetachableResultReceiver:
mReceiver = new DetachableResultReceiver(new Handler());
mReceiver.setReceiver(this);
Затем вы можете передать его во второй фрагмент:
Bundle bundle = new Bundle();
bundle.putParcelable(Consts.EXTRA_RECEIVER, receiver);
fragment.setArguments(bundle);
И используйте его во втором фрагменте:
receiver = getArguments().getParcelable(Consts.EXTRA_RECEIVER);
receiver.send(Consts.SOME_MESSAGE, someData);
Ответ 3
В файле fragmentB.java установлен OnClickListener для выполнения метода в основном классе. Передайте аргумент в фрагментеB.java основному классу, который является переменной, и обрабатывайте остальную часть в своем основном классе. Хотя фрагменты вообще не должны зависеть от действий. Фрагменты были сделаны для подключения и воспроизведения в любом месте.
Этот пример показывает EditTextListener:
myAwesomeActivity.java
fragmentA.java
fragmentB.java
fragmentB.java:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
int x = 3;
EditText ed1 = (EditText) getView().findViewById(R.id.editText1);
ed1.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (MotionEvent.ACTION_UP == event.getAction()) {
((myAwesomeActivity) getActivity()).myMethod(x);
}
return false;
}
});
}
myAwesomeActivity.java:
publiv void myMethod (int x){
//Do whatever you want with variable
}
Все, что вам нужно сделать, это реализовать правильный тип слушателя, но будет показано главное. В одном действии фрагмента вызовите метод и передайте переменную основной деятельности. Из основного действия вы можете отправить его в свою другую активность фрагмента, если хотите.
Ответ 4
Вы также можете использовать SharedPreferences
для сохранения некоторой строки и после возврата обратно к первому фрагменту загрузить его и очистить.