Android: Можете ли вы вкладывать фрагменты? - PullRequest
29 голосов
/ 03 июня 2011

Можно ли вставить Fragment в макет другого Fragment? Кто-нибудь пробовал это?

Ответы [ 4 ]

46 голосов
/ 14 ноября 2012

Наконец-то!обновление для Android 4.2 поставляется с поддержкой по умолчанию для вложенных фрагментов, также совместимых: Официальные NestedFragments .Более того, поддержка вложенных фрагментов анонсирована в последней 11-й редакции библиотеки поддержки v4 !

7 голосов
/ 03 июня 2011

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

5 голосов
/ 14 марта 2012

Редактировать: Начиная с ACLv11 это необходимо, только если вы replace(...) ViewPagers динамически.

Да, вы можете, но есть определенные способы, которые причиняют боль, но я даже встроил FragmentViewPagers.

Если вы встраиваете XML, то при накачке макета у вас не возникнет проблем.

Если вы динамически встраиваете фрагменты в другой фрагмент, у вас будут проблемы! Хотя это возможно.

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

FoodTestFeast имеет встроенные ViewPager, которые удаляются и добавляются динамически.

My Base FragmentViewPager - фрагмент, содержащий пейджер представления (в котором есть FragmentPagerAdapter)

Я еще не видел сбоев с использованием этого, но дайте мне знать, если кто-то еще делает.

/**
 * @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;
    }

}

К вашему сведению, ваш макет должен выглядеть примерно так (или аналогично): ПРИМЕЧАНИЕ. Индикатор = 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>
0 голосов
/ 28 октября 2014

Умный способ решить невозможность использования вложенных фрагментов - использовать как v4, так и собственные фрагменты. Это работает (я использую его во многих приложениях), и в некоторых случаях это то, что нам нужно, чтобы обойти это ограничение.

Очевидно, что в упражнении вы можете использовать getFragmentManager () или getSupportFragmentManager () , чтобы различать 2 группы фрагментов.

Возможно, его использование устарело, но оно решает многие ситуации.

...