Как вызвать метод во фрагменте через onClick в другом фрагменте? - PullRequest
0 голосов
/ 09 февраля 2019

Я создаю приложение с 2 фрагментами.Первый фрагмент имеет ImageView и 2 TextView, а второй фрагмент имеет набор кнопок и EditTexts.Во втором фрагменте у меня есть кнопка «Сохранить».Когда нажата эта кнопка, я хочу загрузить изображение из моего 1-го фрагмента в папку моего устройства (объекты ImageView, URI, растровое изображение и холст находятся в 1-м фрагменте).

Поскольку фрагменты могут 'Чтобы общаться друг с другом напрямую, я думал сделать это с помощью интерфейса.Я сделал следующее:

  • Я объявил свой интерфейс во 2-м фрагменте
  • Применил логику метода интерфейса в MainActivity (которая является общей активностью между 2 фрагментами).)
  • Введите необходимые параметры для метода в 1-м фрагменте.
  • Не работает

Но я не думаю, что это был правильный порядокпоэтому неудивительно, что это не сработало.Как применить интерфейс таким образом, чтобы нажатие кнопки во 2-м фрагменте загружало изображение в 1-м фрагменте?

1 Ответ

0 голосов
/ 09 февраля 2019

Вы можете попробовать один из этих трех вариантов:

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 за помощь в улучшении моего ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...