П'ятниця, 19.04.2024, 13:42
Гость

Мішатронік

Мобільна версія | Додати у вибране  | Мій профіль | Вихід | RSS |
Меню сайту
Наше опитування
Багато схем ви спаяли за останній рік?
Всього відповідей: 6
Статистика

Онлайн всього: 1
Гостей: 1
Користувачів: 0


ANDROID: КОМУНІКАЦІЯ З ІНШИМИ ФРАГМЕНТАМИ

Для того, щоб повторно використовувати компоненти Fragment UI (фрагмент користувальницького інтерфейсу), ви повинні створити кожен з них як абсолютно автономний, модульний компонент, в якому визначені власний макет і поведінка.

Після того, коли будуть визначені ці багаторазові Fragments, ви можете асоціювати їх з Activity і з'єднати з логікою додатку для реалізації загальної складової UI.
Часто буде необхідно, щоб один фрагмент спілкуватися з іншим, наприклад, змінював зміст, заснований на події користувача. Всі комунікації Fragment-до-Fragment робляться через відповідну Activity. Два Fragments ніколи не повинні спілкуватися безпосередньо.

ВИЗНАЧЕННЯ ІНТЕРФЕЙСУ

Щоб Fragment мав комунікацію зі своєю Activity, можна визначити інтерфейс в класі Fragment, а його реалізацію в Activity. Activity захоплює реалізацію інтерфейсу під час свого методу onAttach() життєвого циклу , а потім може викликати методи Interface для того, щоб спілкуватися з Activity.
Приклад комунікації Fragment з Activity:

public class HeadlinesFragment extends ListFragment {
    OnHeadlineSelectedListener mCallback;

    // Контейнер Activity повинен реалізувати цей інтерфейс
    public interface OnHeadlineSelectedListener {
        public void onArticleSelected(int position);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        
        // Тут переконайтеся, що контейнер activity реалізував
        // зворотний виклик інтерфейсу. Якщо ні, то видається виняток
        try {
            mCallback = (OnHeadlineSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnHeadlineSelectedListener");
        }
    }
    
    ...
}

Тепер фрагмент може доставляти повідомлення в activity, викликаючи метод onArticleSelected() (або інші методи в інтерфейсі), використовуючи екземпляр mCallback інтерфейсу OnHeadlineSelectedListener.
Наприклад, наступний метод в фрагменті викликається, коли користувач натискає на елемент списку. Фрагмент використовує інтерфейс зворотного виклику, щоб передати подію в батьківську activity:

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // відправка події до приймаючої activity
        mCallback.onArticleSelected(position);
    }

РЕАЛІЗАЦІЯ ІНТЕРФЕЙСУ

Для того, щоб отримати зворотні виклики подій від фрагмента, activity, яка є хостом, повинна реалізувати інтерфейс, визначений у класі фрагмента.
Наприклад, наступна activity реалізує інтерфейс з наведеного вище прикладу:

public static class MainActivity extends Activity
        implements HeadlinesFragment.OnHeadlineSelectedListener{
    ...
    
    public void onArticleSelected(int position) {
        // Користувач вибрав заголовок статті з HeadlinesFragment
        // Зробіть що-небудь тут, щоб побачити статтю
    }
}

ДОСТАВКА ПОВІДОМЛЕННЯ ДО ФРАГМЕНТУ

Хост-activity може доставляти повідомлення до фрагменту шляхом захоплення екземпляра Fragment за допомогою findFragmentById(), а потім безпосередньо викликати публічні методи фрагмента.
Наприклад, уявіть, що показана вище activity може містити інший фрагмент, який використовується для відображення елемента, зазначеного в даних, які повертаються вище в методі зворотного виклику. У цьому випадку, activity може передавати інформацію, отриману в методі зворотного виклику, до іншого фрагмента, який буде відображати елемент:

public static class MainActivity extends Activity
        implements HeadlinesFragment.OnHeadlineSelectedListener{
    ...

    public void onArticleSelected(int position) {
        // Користувач вибрав заголовок статті з HeadlinesFragment
        // Зробіть що-небудь тут, щоб побачити статтю

        ArticleFragment articleFrag = (ArticleFragment)
            getSupportFragmentManager().findFragmentById(R.id.article_fragment);

        if (articleFrag != null) {
            // Якщо шматок статті доступний, то він в двох панельному макеті...

            // Викликаємо метод в ArticleFragment для оновлення його змісту
            articleFrag.updateArticleView(position);
        } else {
            // Інакше, маємо одно панельний макет і повинні поміняти шматок...

            // Створити фрагмент і дати йому аргумент для обраної статті
            ArticleFragment newFragment = new ArticleFragment();
            Bundle args = new Bundle();
            args.putInt(ArticleFragment.ARG_POSITION, position);
            newFragment.setArguments(args);
        
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

            // Замінити все у вигляді контейнеру фрагмента з цього фрагмента,
            // і додати транзакцію в задній стек, щоб користувач міг повернутися назад
            transaction.replace(R.id.fragment_container, newFragment);
            transaction.addToBackStack(null);

            // Виконати транзакцію
            transaction.commit();
        }
    }
}

 

Форма входа
Пошук
Друзі сайту
Календар
«  Квітень 2024  »
ПнВтСрЧтПтСбНд
1234567
891011121314
15161718192021
22232425262728
2930

Єдина Країна! Единая Страна!