Подтвердить что ты не робот

Как передать результат из второго фрагмента в первый фрагмент

В моем приложении у меня есть два фрагмента: фрагмент и FragmentB. Когда я нажимаю кнопку в fragmetA, список открывается в фрагментеB. Теперь, когда я выбираю элемент из списка в fragmentB, я хочу, чтобы результат был передан фрагменту. Я использую только одну TabActivity для всех фрагментов. Когда элемент списка выбран в фрагментB, я выхожу из fragmentB из стека, чтобы сразу вернуться к фрагменту.

Кто-нибудь знает, как передать результат предыдущему фрагменту.

Спасибо.

4b9b3361

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