Skip to content

Most visited

Recently visited

navigation

Generar una IU flexible

En esta lección, aprenderás a realizar lo siguiente:

  1. Agregar un fragmento a una actividad en tiempo de ejecución
  2. Reemplazar un fragmento con otro

También debes leer:

Pruébalo

Descargar el ejemplo

FragmentBasics.zip

Al diseñar tu aplicación para que admita una amplia variedad de tamaños de pantalla, puedes reutilizar tus fragmentos en diferentes configuraciones de diseño a fin de optimizar la experiencia del usuario en función del espacio de pantalla disponible.

Por ejemplo, en un teléfono celular, sería adecuado mostrar un solo fragmento a la vez para una interfaz de usuario de un solo panel. Por el contrario, te recomendamos disponer los fragmentos uno junto al otro en una tablet, ya que tiene un mayor tamaño de pantalla que permite mostrar más información al usuario.

Figura 1: Dos fragmentos exhibidos en distintas configuraciones para la misma actividad en diferentes tamaños de pantalla. En una pantalla grande, ambos fragmentos pueden ubicarse uno al lado del otro, pero en un teléfono celular solo puede exhibirse un fragmento a la vez, de modo que un fragmento reemplaza a otro a medida que el usuario navega.

La clase FragmentManager proporciona métodos que te permiten agregar, quitar y reemplazar fragmentos en una actividad en tiempo de ejecución a fin de crear una experiencia dinámica.

Agregar un fragmento a una actividad en tiempo de ejecución

En lugar de definir los fragmentos para una actividad en el archivo de diseño, como se muestra en la lección anterior con el elemento <fragment>, puedes agregar un fragmento a la actividad durante el tiempo de ejecución de esta. Esto es necesario si piensas cambiar fragmentos durante la vida útil de la actividad.

Para realizar una transacción, como agregar o quitar un fragmento, debes usar FragmentManager para crear una FragmentTransaction, que proporciona API para agregar, quitar, reemplazar y realizar otras transacciones de fragmentos.

Si tu actividad permite quitar y reemplazar fragmentos, debes agregar los fragmentos iniciales a la actividad durante el método onCreate() de esta.

Una regla importante al trabajar con fragmentos, en especial al agregar fragmentos en tiempo de ejecución, es que el diseño de tu actividad debe incluir un contenedor View en el que puedas insertar el fragmento.

El siguiente diseño es una alternativa al diseño que se muestra en la lección anterior y que exhibe un solo fragmento a la vez. Para poder reemplazar un fragmento por otro, el diseño de la actividad incluye un FrameLayout vacío que actúa como el contenedor del fragmento.

Ten en cuenta que el nombre del archivo es el mismo que el del archivo de diseño de la lección anterior, pero el directorio de diseño no tiene el calificador large, por lo cual este diseño se usa cuando el tamaño de la pantalla del dispositivo es más pequeño que el grande, ya que no admite ambos fragmentos al mismo tiempo.

res/layout/news_articles.xml:

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

En tu actividad, llama a getSupportFragmentManager() para obtener un FragmentManager mediante el uso de las Support Library API. Luego llama a beginTransaction() para crear una FragmentTransaction y llama a add() para agregar un fragmento.

Puedes realizar múltiples transacciones de fragmentos para la actividad mediante la misma FragmentTransaction. Cuando estés listo para realizar los cambios, debes llamar a commit().

Por ejemplo, aquí te mostramos cómo agregar un fragmento al diseño anterior:

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

        // Check that the activity is using the layout version with
        // the fragment_container FrameLayout
        if (findViewById(R.id.fragment_container) != null) {

            // However, if we're being restored from a previous state,
            // then we don't need to do anything and should return or else
            // we could end up with overlapping fragments.
            if (savedInstanceState != null) {
                return;
            }

            // Create a new Fragment to be placed in the activity layout
            HeadlinesFragment firstFragment = new HeadlinesFragment();

            // In case this activity was started with special instructions from an
            // Intent, pass the Intent's extras to the fragment as arguments
            firstFragment.setArguments(getIntent().getExtras());

            // Add the fragment to the 'fragment_container' FrameLayout
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.fragment_container, firstFragment).commit();
        }
    }
}

Debido a que el fragmento se agregó al contenedor de FrameLayout en tiempo de ejecución, en lugar de definirlo en el diseño de la actividad con un elemento <fragment>, la actividad puede quitar el fragmento y reemplazarlo por uno diferente.

Reemplazar un fragmento con otro

El procedimiento para reemplazar un fragmento es similar al que se sigue para agregar un fragmento, pero requiere un método replace() en lugar de add().

Recuerda que cuando realices transacciones con fragmentos, como reemplazar o quitar uno, se recomienda permitir al usuario retroceder en la navegación y “deshacer” el cambio. Para permitir al usuario retroceder en la navegación de las transacciones con fragmentos, debes llamar a addToBackStack() antes de confirmar la FragmentTransaction.

Nota: Cuando quitas o reemplazas un fragmento y agregas la transacción a la pila de retroceso, el fragmento que se quita se detiene (no se destruye). Si el usuario retrocede en su navegación para restaurar el fragmento, este se reinicia. Si no agregas la transacción a la pila de retroceso, al quitar o reemplazar un fragmento este se destruirá.

Ejemplo del reemplazo de un fragmento con otro:

// Create fragment and give it an argument specifying the article it should show
ArticleFragment newFragment = new ArticleFragment();
Bundle args = new Bundle();
args.putInt(ArticleFragment.ARG_POSITION, position);
newFragment.setArguments(args);

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack so the user can navigate back
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();

En el método addToBackStack() se incluye un parámetro de string opcional que especifica un nombre único para la transacción. El nombre no es necesario a menos que pienses realizar operaciones avanzadas con fragmentos usando las FragmentManager.BackStackEntry API.

This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Follow Google Developers on WeChat

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a short survey?
Help us improve the Android developer experience.
(Sep 2017 survey)