MyTetra Share
Делитесь знаниями!
CrimeActivity.java
14.04.2017
10:29
Раздел: Android - books - AndroidProgramming2e - 7 UI-фрагменты и FragmentManager
CrimeActivity.java

CrimeActivity.java

package com.bignerdranch.android.criminalintent; 
 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
 
 
public class CrimeActivity extends FragmentActivity { 
 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_crime); 
 
        //~ Чтобы добавить фрагмент в активность в коде, следует обратиться с вызовом к объекту FragmentManager активности. Прежде всего необходимо получить сам объект 
        //~ FragmentManager. 
        //~ Мы вызываем getSupportFragmentManager(), потому что в приложении используется библиотека поддержки и класс FragmentActivity. Если бы мы не использовали библиотеку поддержки, то вместо этого можно было бы субклассировать 
        //~ Activity и вызвать getFragmentManager(). 
 
        FragmentManager fm = getSupportFragmentManager(); 
        Fragment fragment = fm.findFragmentById(R.id.fragment_container); 
 
        //~ Транзакции фрагментов используются для добавления, удаления, присоединения, 
        //~ отсоединения и замены фрагментов в списке фрагментов. Они лежат в основе механизма использования фрагментов для формирования и модификации экранов 
        //~ во время выполнения. FragmentManager ведет стек транзакций, по которому вы можете перемещаться. 
        //~ Метод FragmentManager.beginTransaction() создает и возвращает экземпляр 
        //~ FragmentTransaction. Класс FragmentTransaction использует динамичный интерфейс: методы, настраивающие FragmentTransaction, возвращают FragmentTransaction вместо void, что позволяет объединять их вызовы в цепочку. Таким 
        //~ образом, выделенный код в листинге 7.12 означает: «Создать новую транзакцию 
        //~ фрагмента, включить в нее одну операцию add, а затем закрепить». 
        //~ Метод add(…) является основным содержанием транзакции. Он получает два параметра: идентификатор контейнерного представления и недавно созданный объект CrimeFragment. Идентификатор контейнерного представления вам должен 
        //~ быть знаком: это идентификатор ресурса элемента FrameLayout, определенного 
        //~ в файле activity_crime.xml. 
        //~ Идентификатор контейнерного представления выполняет две функции: 
        //~ * сообщает FragmentManager, где в представлении активности должно находиться представление фрагмента; 
        //~ * обеспечивает однозначную идентификацию фрагмента в списке FragmentManager. 
        //~ Когда вам потребуется получить экземпляр CrimeFragment от FragmentManager, запросите его по идентификатору контейнерного представления. 
        //~ Может показаться странным, что FragmentManager идентифицирует CrimeFragment 
        //~ по идентификатору ресурса FrameLayout. Однако идентификация UI-фрагмента 
        //~ по идентификатору ресурса его контейнерного представления встроена в механизм работы FragmentManager. Если вы добавляете в активность несколько фрагментов, то обычно для каждого фрагмента создается отдельный контейнер со своим идентификатором. 
        //~ Теперь мы можем кратко описать код, добавленный в листинг 7.15, от начала до 
        //~ конца. 
        //~ Сначала у FragmentManager запрашивается фрагмент с идентификатором контейнерного представления R.id.fragmentContainer. Если этот фрагмент уже находится в списке, FragmentManager возвращает его. 
        //~ Почему фрагмент может уже находиться в списке? Вызов CrimeActivity. 
        //~ onCreate(…) может быть выполнен в ответ на воссоздание объекта CrimeActivity 
        //~ после его уничтожения из-за поворота устройства или освобождения памяти. При 
        //~ уничтожении активности ее экземпляр FragmentManager сохраняет список фрагментов. При воссоздании активности новый экземпляр FragmentManager загружает 
        //~ список и воссоздает хранящиеся в нем фрагменты, чтобы все работало как прежде. 
        //~ С другой стороны, если фрагменты с заданным идентификатором контейнерного представления отсутствуют, значение fragment равно null. В этом случае мы 
        //~ создаем новый экземпляр CrimeFragment и новую транзакцию, которая добавляет 
        //~ фрагмент в список. 
        //~ Теперь CrimeActivity является хостом для 
        //~ CrimeFragment.  
 
        if (fragment == null) { 
            fragment = new CrimeFragment(); 
            fm.beginTransaction() 
                    .add(R.id.fragment_container, fragment) 
                    .commit(); 
        } 
    } 
 
} 

 
MyTetra Share v.0.52
Яндекс индекс цитирования