Как передать функцию обратного вызова из одного фрагмента внутри действия второму действию?

У меня есть интерфейс обратного вызова.

public interface RowCallback {

    void callOnRowAction(String action);
}

Мой фрагмент FragmentA присоединен к ActivityA, в котором FragmentA определяется следующим образом:

class FragmentA extends Fragment implements RowCallback {
  @Override
  void callOnRowAction(String action) {
        . . . Custom implementation . . . 
  }

  ... Other methods . . . 
  @Override
  public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_crime_list, container, false);
     mButton = view.findViewById(R.id.my_button);
     mButton.setOnClickListener((view) -> {
        // I want to pass the callback instance (which is FragmentA) to activity B.
        Intent intent = new Intent(getActivity(), ActivityB.class);
        . . .  Some more intent initialisation. . . 
        startActivity(intent);
     });
      return view;
  }


}

Исходный код ActivityB

public class ActivityB extends AppCompatActivity {


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

        FragmentManager fm = getSupportFragmentManager();
        Fragment fragment = fm.findFragmentById(R.id.fragment_container);
        if (fragment == null) {
            fragment = createFragment(getIntent());
            fm.beginTransaction().add(R.id.fragment_container, fragment).commit();
        }
    }

   private Fragment createFragment(Intent intent) {
      FragmentB fragment = new FragmentB();
      Bundle bundle = new Bundle();
      . . . . initialise bundle . . . 
      // I want to pass the callback instance from the intent to the callback function.
     // In this example, the callback instance would be an instance of fragment A.
      fragment.setArguments(bundle);
     return fragment;
   }
}

В экземпляре FragmentB я хочу вызвать метод обратного вызова, если будет выполнено логическое условие. Я хочу вернуться к ActivityA / FragmentA после того, как функция обратного вызова была вызвана путем вызова getActivity().finish();

Как я могу добиться чего-то подобного?

2
0
1 610
3

Ответы 3

Я разделю свой ответ:

  1. Если вам нужен обратный звонок один раз:

    • Фрагмент А OnclickListener вызовет его Activity (скажем, A).
    • Действие А подойдет StartActivityForResult(intent) к активности B.
    • Действие B будет прикрепите Фрагмент B к себе.
    • Фрагмент B OnclickListener будет обновите его Активность (B).
    • Действие B вернет IntentResult, а действие A перехватит его на onActivityResult.
  2. Если вам нужен обратный вызов несколько раз:

На самом деле кнопка FragmentA (которая создается ActivityA) в прослушивателе кликов будет вызывать Activity B из фрагмента. Вся логика заключена внутри фрагмента. Действие не делает ничего, кроме создания экземпляра фрагмента. Я хочу, чтобы обратный вызов запускался каждый раз, когда выполняется логическое условие внутри FragmentB. Например, если бы у меня была ссылка на экземпляр обратного вызова во фрагменте B, я бы просто вызвал callbackInstance.callOnRowAction("delete"); в методах FragmentB.

manoflogan 24.11.2018 12:59

Я также хочу вернуться к ActivityA после того, как задача будет выполнена.

manoflogan 24.11.2018 13:21

Реализовать функцию внутри фрагмента, который вы хотите получить обратно после выполнения

    public void testCallBack(Callback callback) {

    callback.callOnRowAction("callback");

}

Реализуйте это в классе Activity

   public void getCallBack() {

    FragmentA.newInstance().testCallBack(new FragmentA.Callback() {
        @Override
        public void callOnRowAction(String action) {
            //you can do something
        }
    });
}

если вы хотите вызвать метод testCallBack при запуске функции, вы можете вызвать его внутри метода onCreate

Как загрузить ActivityB из события нажатия кнопки, которая была инициализирована во фрагментеA ActivityA? Я хочу вернуться к ActivityA после вызова обратного вызова. Поэтому я буду вызывать getActivity (). Finish () после того, как функция обратного вызова была вызвана в методе FragmentB.

manoflogan 24.11.2018 13:27

Вы можете внутри фрагмента добавить

if (getParentFragment() instanceof Activity1)
((Activity1) getParentFragment()).setRowCallback(this);
else if (getParentFragment() instanceof Activity2)
((Activity2) getParentFragment()).setRowCallback(this);

фрагмент автоматически вызовет обратный вызов своей родительской активности

Другие вопросы по теме