Вы можете попробовать один из этих трех вариантов:
1.) Использование обратных вызовов для связи через действие
Как показано в этой статье , вы можете определить интерфейс во фрагменте 2, который затем вызывается при нажатии кнопки.Ваша деятельность (которая содержит фрагмент 2) предоставляет реализацию для этого интерфейса, в которой действие вызывает метод во фрагменте 1 для загрузки изображения.Например:
Фрагмент 1, обеспечивающий метод загрузки
public class Fragment1 extends Fragment {
OnButtonClickedListener mCallback;
public void startImageDownload() {
// Download the image
}
// ...
}
Фрагмент 2, определяющий и вызывающий интерфейс
public class Fragment2 extends Fragment {
OnButtonClickedListener mCallback;
// Some kind of init method called by onCreate etc.
private void init() {
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Call the listener if present
if(mCallback != null) {
mCallback.onButtonClicked();
}
}
});
}
public void setOnButtonClickedListener(Activity activity) {
mCallback = activity;
}
// Container Activity must implement this interface
public interface OnButtonClickedListener {
public void onButtonClicked();
}
// ...
}
Активность, реагирующая на нажатие кнопки и вызывающая метод загрузки
public static class MainActivity extends Activity implements Fragment2.OnButtonClickedListener {
Fragment1 mFragment1;
@Override
public void onAttachFragment(Fragment fragment) {
if (fragment instanceof Fragment2) {
// Register the listener
Fragment2 fragment2 = (Fragment2) fragment;
fragment2.setOnButtonClickedListener(this);
} else if (fragment instanceof Fragment1) {
// Keep a reference to fragment 1 for calling the "download" method
mFragment1 = (Fragment1) fragment;
}
}
@Override
public void onButtonClicked() {
// Handle the button click
mFragment1.startImageDownload();
}
}
Таким образом, вы избегаете связывать фрагменты вместе, вместо этого у вас есть активность, имеющая слабую «связь» междуфрагмент 1 и фрагмент 2.
Это просто пример, я не успел его проверить.Но я надеюсь, что это поможет.
2.) Использование локальной трансляции
Я бы порекомендовал использовать LocalBroadcastManager
для отправки трансляции во фрагменте 1 (что кнопкащелкнул) и получил его во фрагменте 2 (загрузка изображения). Здесь - отличная статья о локальных трансляциях.
3.) Другой вариант - использовать ViewModel
. ViewModel
был недавно представленновый Android Jetpack и «предназначен для хранения и управления данными, связанными с пользовательским интерфейсом, с учетом жизненного цикла. Класс ViewModel позволяет данным переживать изменения конфигурации, такие как поворот экрана».(из Обзор ViewModel ).
Его также можно использовать для обмена данными между двумя фрагментами : ваша деятельность в основном содержит модель представления, и фрагменты (внутри этой операции) могут получить к ней доступ, вызвав: ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
IПодумайте, в вашем сценарии вы могли бы использовать Observers или какой-либо вид LiveData, чтобы реагировать на нажатие кнопки через ViewModel.
Спасибо @Elletlar за помощь в улучшении моего ответа.