Телефонуйте » (+38) 096 227 41 41

Для того, щоб повторно використовувати компоненти 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();
        }
    }
}

На закынчення, навчальны выдео:




(Джерело: developer.android.com)

Новини

  • SDR в IoT

    iotSDR пропонує платформу розробок для IoT-радіо та мережевих доменів. На платі два передавачі Microchip AT86RF215, для вводу-виводу модему на Xilinx ZYNQ SoC, приймач GNSS MAX2769 для GPS, Galileo, BieDou та Glonass. Плата сумісна з ПЗ GNURadio SDR. Дозволяє розробити протоколи фізичного рівня LoRa, SigFox, WightLess, Bluetooth, BLE, 802.15.4, ZigBee тощо для IoT, або шлюз IoT через TheThingsNetwork, LPWAN або Google Thread. Пам'ять EEPROM: 1x AT24MAC602 , flash-пам'ять: 1x QSPI 128 Мб, RAM: 256 MБ DDR3,слот для Micro SD карти, входи/виходи: 2x 8-бітних інтерфейси PL, інтерфейс 8-бітного PS, Gigabit Ethernet, USB 2.0 (USB3310), USB 2.0 (CP2104), 2x SMA RF-роз'єми для приймача діапазонів IoT, 2x SMA RF-роз'єми для приймача 2,4 ГГц , RF-роз'єм приймач GNSS, FPGA-роз'єм JTAG для програмування. Розміри плати: 76,2 мм x 101,6 мм.

     

    in Новини

Записатися на курс