3.2. Создание гибкого пользовательского интерфейса

При разработке своего приложения для поддержки разных размеров экрана вы можете использовать свои фрагменты в разных компановках, чтобы оптимизировать работу пользователя на основе доступного пространства экрана.

Например, на мобильном устройстве целесообразно отображать только один фрагмент для пользовательского интерфейса с одной панелью. А на планшете размещать бок-о-бок два фрагмента, так как устройство имеет более широкий размер экрана и позволяет отображать пользователю дополнительную информацию.

Рисунок 1. Два фрагмента, отображаемых в разных конфигурациях для одной и той же активности при разных размерах экрана. На большом экране оба фрагмента расположены бок о бок, но на мобильном устройстве только один фрагмент отображается единовременно, фрагменты заменяют друг друга, когда пользователь перемещается между ними.

Класс FragmentManager предоставляет методы, позволяющие добавлять, удалять и заменять фрагменты на активности (Activity) во время выполнения, позволяя создать динамический пользовательский интерфейс.

 

Добавить фрагмент в Activity во время выполнения

Вместо определения фрагментов для Activity в файле макета, как показано в предыдущем уроке с элементом <фрагмент>, вы можете добавить фрагмент к активности программно. Это необходимо, если вы планируете менять фрагменты в процессе работы.

Чтобы выполнить транзакцию, такую ​​как добавление или удаление фрагмента, вы должны использовать FragmentManager для создания FragmentTransaction, который предоставляет API для добавления, удаления, замены и выполнения других транзакций фрагментов.

Если ваша Activity должна удалять и заменять фрагменты, вы должны добавить исходный фрагмент (ы) к активности во время действия метода onCreate ().

Важным правилом при работе с фрагментами, особенно при добавлении фрагментов во время выполнения, является то, что ваш макет активности должен включать контейнер, в который вы можете вставить фрагмент.

Следующий макет является альтернативой макету тому, что был на предыдущем уроке, который показывает только один фрагмент за раз. Чтобы заменить один фрагмент на другой, макет действия включает пустой FrameLayout, который действует как контейнер фрагмента.

Обратите внимание, что имя файла совпадает с файлом макета в предыдущем уроке, но в каталоге макета нет большого определителя, поэтому этот макет используется, когда экран устройства меньше, чем большой, потому что экран не подходит для обоих фрагментов одновременно.

 

res/layout/news_articles.xml:

 xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Внутри вашей Activity вызовите getSupportFragmentManager (), чтобы получить FragmentManager, используя API-интерфейсы библиотеки поддержки. Затем вызовите beginTransaction (), чтобы создать FragmentTransaction и вызовите add (), чтобы добавить фрагмент.

Вы можете выполнять транзакцию нескольких фрагментов для Activity с использованием того же FragmentTransaction. Когда вы будете готовы внести изменения, необходимо выполнить commit ().

Например, вот как добавить фрагмент к предыдущему макету:

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

public class MainActivity extends FragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.news_articles);

       
        if (findViewById(R.id.fragment_container) != null) {

           
            if (savedInstanceState != null) {
                return;
            }
          
            HeadlinesFragment firstFragment = new HeadlinesFragment();

           firstFragment.setArguments(getIntent().getExtras());

            getSupportFragmentManager().beginTransaction()
                    .add(R.id.fragment_container, firstFragment).commit();
        }
    }
}

 

Поскольку фрагмент был добавлен в контейнер FrameLayout во время выполнения – вместо определения его в макете Activity с помощью элемента <фрагмент>, программно можно также удалить или изменить фрагмент.

 

Заменить один фрагмент другим

Процедура замены фрагмента похожа на добавление одного, но вместо метода add()  требуется метод replace ().

Имейте в виду, что при выполнении транзакций фрагментов, таких как замена или удаление, часто бывает необходимо разрешить пользователю перемещаться назад и «отменить» изменение. Чтобы позволить пользователю перемещаться назад через транзакции фрагмента, вы должны вызывать addToBackStack () перед фиксацией FragmentTransaction.

Примечание. Когда вы удаляете или заменяете фрагмент и добавляете транзакцию в стек, удаляемый фрагмент останавливается (не уничтожается). Если пользователь вернется назад для восстановления фрагмента, он перезапустится. Если вы не добавляете транзакцию в стек, тогда фрагмент уничтожается при удалении или замене.

Пример замены одного фрагмента на другой:


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();

Метод addToBackStack () принимает необязательный строковый параметр, который указывает уникальное имя для транзакции. Имя не требуется, если вы не планируете выполнять расширенные операции над фрагментом с использованием API-интерфейсов FragmentManager.BackStackEntry.

You may also like...

13 комментариев

  1. Indian Maker Finasteride Need Cod Only Free Shipping Clobetasol Psoriasis canadian pharmacy cialis 20mg Dapoxetina Depressione

  2. Dutasteride Website No Physician Approval Indian Pharmacy Clomid cialis Secure Ordering Generic Zentel In Internet Overseas Can I Buy Levitra In Mexico

  3. Want To Buy Dutasteride Antabuse Greece donde comprar cialis precio Evitra En Ligne Cialis Lilly Beipackzettel Baclofene Liquide

  4. Plavix Discount Canada1 Mg Prednisone No Scrip Amoxicillin Buy Rx Comprar Cialis En Valencia Sin Receta propecia disconts online Propecia Generic Finasteride Clinically Proven Get Free Cialis Samples

  5. Priligy Effetti Indesiderati viagra Le Viagra Precoce

Добавить комментарий

Ваш e-mail не будет опубликован.

Lost your password? Please enter your username or email address. You will receive a link to create a new password via email.
Регистрация не требуется. В качестве логина укажите рабочую почту, в качестве пароля - пароль от компьютера.