У меня есть интерфейс обратного вызова.
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();
Как я могу добиться чего-то подобного?
Я разделю свой ответ:
Если вам нужен обратный звонок один раз:
OnclickListener
вызовет его Activity (скажем, A).StartActivityForResult(intent) к активности B.OnclickListener будет
обновите его Активность (B).onActivityResult.Если вам нужен обратный вызов несколько раз:
LocalBroadcastManager
Пример к Связь действий с использованием LocalBroadcastManagerЯ также хочу вернуться к ActivityA после того, как задача будет выполнена.
Реализовать функцию внутри фрагмента, который вы хотите получить обратно после выполнения
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.
Вы можете внутри фрагмента добавить
if (getParentFragment() instanceof Activity1)
((Activity1) getParentFragment()).setRowCallback(this);
else if (getParentFragment() instanceof Activity2)
((Activity2) getParentFragment()).setRowCallback(this);
фрагмент автоматически вызовет обратный вызов своей родительской активности
На самом деле кнопка FragmentA (которая создается ActivityA) в прослушивателе кликов будет вызывать Activity B из фрагмента. Вся логика заключена внутри фрагмента. Действие не делает ничего, кроме создания экземпляра фрагмента. Я хочу, чтобы обратный вызов запускался каждый раз, когда выполняется логическое условие внутри FragmentB. Например, если бы у меня была ссылка на экземпляр обратного вызова во фрагменте B, я бы просто вызвал
callbackInstance.callOnRowAction("delete");в методах FragmentB.