30

是否可以将 a 粘贴到Fragmentanother 的布局中Fragment?有没有人试过这个?

4

4 回答 4

47

最后!android 4.2 更新默认支持嵌套片段,也兼容: 官方 NestedFragments。更重要的是,在最新的第 11 版v4 支持库中宣布了对嵌套片段的支持!

于 2012-11-14T15:28:53.643 回答
7

不,片段当前不在层次结构中。试图将一个片段嵌入另一个片段可能会导致问题,通常是微妙的。

于 2011-06-03T02:02:36.747 回答
5

编辑:replace(...) ViewPagers从 ACLv11 开始,仅当您动态时才需要这样做。

是的,你可以,但有些方法很痛苦,但我什至嵌入了 FragmentViewPagers。

如果您嵌入 XML,那么当布局膨胀时,您将没有问题。

如果您将片段动态嵌入另一个片段中,那么您将遇到问题!虽然这是可能的。

通常涉及发布到处理程序,然后在当前片段转换之后执行,然后开始另一个,这样您可以很容易地嵌入片段。但这会导致其他问题,因此您必须小心如何实现这一点。

FoodTestFeast 嵌入了动态删除和添加的 ViewPager。

我的基本 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;
    }

}

仅供参考,您的布局需要看起来像这样(或类似): 注意指标 = 消失!

<?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>
于 2012-03-14T10:39:10.373 回答
0

解决无法使用嵌套片段的一个聪明方法是同时使用 v4 和原生片段。它有效(我在许多应用程序中使用它),在某些情况下,我们需要绕过这个限制。

显然,在activity中你可以使用getFragmentManager()或者getSupportFragmentManager()来区分2组fragment。

可能是不推荐使用它,但它解决了我很多情况。

于 2014-10-28T11:03:11.110 回答