是否可以在另一个Fragment
的布局中粘贴Fragment
?有人试过吗?
答案 0 :(得分:46)
最后! android 4.2更新附带嵌套片段的默认支持,也兼容: Official NestedFragments。更重要的是,嵌套片段的支持在最新的第11版v4 support library中宣布了!
答案 1 :(得分:7)
不,片段目前不在层次结构中。试图将一个片段嵌入另一个片段可能会导致问题,通常是微妙的。
答案 2 :(得分:5)
修改:从ACLv11开始,只有动态replace(...)
ViewPagers
才需要这样做。
是的,你可以,但有些方法很痛苦,但我甚至嵌入了FragmentViewPagers。
如果您嵌入XML,那么当布局膨胀时,您将没有任何问题。
如果您在另一个片段中动态嵌入片段,那么您将遇到问题!虽然有可能。
通常涉及发布到处理程序,然后在当前片段转换之后执行然后启动另一个处理程序,这样您就可以非常容易地嵌入片段。但这导致了其他问题,所以你必须小心如何实现它。
FoodTestFeast嵌入了ViewPagers,它们被动态删除和添加。
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>
答案 3 :(得分:0)
解决使用嵌套片段的不可能性的一种聪明方法是同时使用v4和本机片段。 它可以工作(我在许多应用程序中使用它),在某些情况下我们需要绕过这个限制。
显然,在活动中你可以使用 getFragmentManager()或 getSupportFragmentManager()来区分这两组碎片。
可能是对它的弃用,但它解决了我很多情况。