Android: ¿Puedes anidar Fragmentos?


Es posible meter un Fragment en el diseño de otro Fragment? ¿Alguien ha intentado esto?

Author: Fllo, 2011-06-03

4 answers

Finalmente! la actualización de Android 4.2 viene con soporte predeterminado para fragmentos anidados, también compatible: Fragmentos anidados oficiales. Además, el soporte de los fragmentos anidados se anunció en la última 11a revisión de la biblioteca de soporte v4!

 46
Author: Dan Elkayam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-14 16:24:46

No, los fragmentos NO están actualmente en una jerarquía. Tratar de tener un fragmento incrustado en otro puede llevar a problemas, a menudo sutiles.

 7
Author: hackbod,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-01 14:36:42

Editar: A partir de ACLv11 esto solo es necesario si replace(...) ViewPagers dinámicamente.

Sí puedes, pero hay ciertas formas que son un dolor, pero incluso he incrustado FragmentViewPagers.

Si inserta en XML, cuando el diseño se infla no tendrá problemas.

Si incrustas fragmentos dinámicamente dentro de otro fragmento, ¡obtendrás problemas! Aunque es posible.

Generalmente implica la publicación a un controlador que luego se ejecuta después de la la transición del fragmento actual inicia otro, de esta manera puede incrustar fragmentos con bastante facilidad. Pero esto conduce a otros problemas, por lo que debe tener cuidado de cómo implementar esto.

FoodTestFeast tiene ViewPagers incrustados que se eliminan y agregan dinámicamente.

Mi Base FragmentViewPager-Fragmento que contiene un buscapersonas de vista (Que tiene FragmentPagerAdapter)

Todavía no he visto ningún fallo usando esto, pero avísame si alguien más lo hace.

/**
 * @project FoodFeast
 * @author chris.jenkins
 * @created Dec 28, 2011
 */
package couk.jenxsolution.food.ui.fragments;

import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.viewpagerindicator.TabPageIndicator;

import couk.jenxsolution.food.R;
import couk.jenxsolution.food.app.FoodApplication;

/**
 * @author chris.jenkins
 */
public class QuizPagerBaseFragment extends QuizBaseFragment
{

    // Data
    private FragmentStatePagerAdapter mAdapter = null;

    // Views
    private int layoutRes;
    private View mRootView;
    private ViewPager mPager;
    private TabPageIndicator mIndicator;

    // Handlers
    private final Handler handler = new Handler();
    private Runnable runPager;
    private boolean mCreated = false;

    /**
     * @see android.support.v4.app.Fragment#onCreateView(android.view.LayoutInflater,
     *      android.view.ViewGroup, android.os.Bundle)
     */
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        mRootView = inflater.inflate(layoutRes, container, false);
        mPager = (ViewPager) mRootView.findViewById(R.id.pager);
        mPager.setOffscreenPageLimit(2);
        mIndicator = (TabPageIndicator) mRootView.findViewById(R.id.indicator);
        mIndicator.setTypeface(FoodApplication.getInstance().getTFs().getTypeFaceBold());

        return mRootView;
    }

    /**
     * @see android.support.v4.app.Fragment#onActivityCreated(android.os.Bundle)
     */
    @Override
    public void onActivityCreated(Bundle savedInstanceState)
    {
        super.onActivityCreated(savedInstanceState);
        if (runPager != null) handler.post(runPager);
        mCreated = true;
    }

    /**
     * @see android.support.v4.app.Fragment#onPause()
     */
    @Override
    public void onPause()
    {
        super.onPause();
        handler.removeCallbacks(runPager);
    }

    /**
     * Set the ViewPager adapter from this or from a subclass.
     * 
     * @author chris.jenkins
     * @param adapter
     */
    protected void setAdapter(FragmentStatePagerAdapter adapter)
    {
        mAdapter = adapter;
        // mAdapter.notifyDataSetChanged();
        runPager = new Runnable() {

            @Override
            public void run()
            {
                mPager.setAdapter(mAdapter);
                mIndicator.setViewPager(mPager);
                // mAdapter.notifyDataSetChanged();
                mIndicator.setVisibility(View.VISIBLE);
            }
        };
        if (mCreated)
        {
            handler.post(runPager);
        }
    }

    /**
     * Has to be set before onCreateView
     * 
     * @author chris.jenkins
     * @param layoutRes
     */
    protected void setLayoutRes(int layoutRes)
    {
        this.layoutRes = layoutRes;
    }

}

FYI su diseño tendrá que tener este aspecto (o similar): TENGA EN CUENTA EL indicador = GONE!

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <com.viewpagerindicator.TabPageIndicator
        android:id="@+id/indicator"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:visibility="gone"/>

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

</LinearLayout>
 5
Author: Chris.Jenkins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-05 17:38:01

Una forma inteligente de resolver la imposibilidad de usar fragmentos anidados es usar tanto v4 como fragmentos nativos. Funciona (lo uso en muchas aplicaciones), y en algunos casos es lo que necesitamos para eludir este límite.

Obviamente, en la actividad puedes usar getFragmentManager() o getSupportFragmentManager() para distinguir los 2 grupos de fragmentos.

Probablemente es un uso obsoleto, pero me resuelve muchas situaciones.

 0
Author: Alecs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-28 11:03:11