getChildFragmentManager()和viewpager [英] getChildFragmentManager() and viewpager

查看:267
本文介绍了getChildFragmentManager()和viewpager的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有同样的问题,因为<一个href=\"http://stackoverflow.com/questions/17672779/navigating-back-to-fragmentpageradapter-fragments-are-empty\">Navigating回到FragmentPagerAdapter - &GT;片段是空的但想使用getChildFragmentManager的解决方案的一些澄清()。

此解决方案使用getChildFragmentManager(),经理查看这片段(OuterFragment,其具有viewpager)的内部片段。 InnerFragment是内部OuterFragment的页面。当有人点击了InnerFragment列表视图,我想InnerFragment2更换InnerFragment。是什么在XML和碎片经理是什么样子?

fragment_outer.xml:

 &LT;?XML版本=1.0编码=UTF-8&GT?;
&LT; android.support.v4.view.ViewPager
    的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:ID =@ + ID / vpPager
    机器人:layout_height =WRAP_CONTENT
    机器人:layout_width =match_parent&GT;    &LT; android.support.v4.view.PagerTabStrip
        机器人:ID =@ + ID / pager_header
        机器人:layout_gravity =顶
        机器人:layout_height =WRAP_CONTENT
        机器人:layout_width =match_parent
        机器人:paddingBottom会=4DP
        机器人:paddingTop =4DP/&GT;    &LT;的FrameLayout
        机器人:ID =@ + ID / inner_content
        机器人:layout_width =match_parent
        机器人:layout_height =match_parent/&GT;&LT; /android.support.v4.view.ViewPager>

OuterFragment.java:

  @覆盖
公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
                         捆绑savedInstanceState){视图V = inflater.inflate(R.layout.fragment_outer,集装箱,FALSE);
vpPager =(ViewPager)v.findViewById(R.id.vpPager);FragmentManager cfManager = getChildFragmentManager();
adapterViewPager =新MyPagerAdapter(cfManager);vpPager.setAdapter(adapterViewPager);
返回伏;
}公共静态类MyPagerAdapter扩展FragmentPagerAdapter {公共MyPagerAdapter(FragmentManager fragmentManager){
    超(fragmentManager);
}@覆盖
公众诠释的getCount(){
    返回2;
}//返回,显示该页面的片段
@覆盖
公共片段的getItem(INT位置){
    开关(位置){
        情况下0:
            返回InnerFragment.newInstance(假);
        情况1:
            返回InnerFragment.newInstance(真);
        默认:
            返回null;
    }
}

InnerFragment显示为内部OuterFragment一个片段,其具有viewpager。 InnerFragment有一个列表视图,单击时,应更换InnerFragment2 InnerFragment。

InnerFragment.java:

  FragmentManager FM = getChildFragmentManager();
FM = fm.beginTransaction();
ft.addToBackStack(NULL);
FT = ft.replace(R.id.inner_content,
                InnerFragment2.newInstance(someArg));
ft.commit();

这将引发一个错误说InnerFragment2不承认查看R.id.inner_content。

不仅要InnerFragment2取代InnerFragment,但是当显示InnerFragment2和它的按钮被点击时,我想InnerFragment2取代InnerFragment3。基本上,我想用inner_content作为内部容器和不断增加片段适当回来行为backstack。

我getChildFragmentManager()或getFragmentManager()每次我添加到我的片段backstack时间,什么是XML模式的样子,因为有我在outerfragment 1的FrameLayout没有这样做。


解决方案

 公共无效setupViewPager(ViewPager viewPager){    FragmentManager cfManager = getChildFragmentManager();
    viewPagerAdapter =新ViewPagerAdapter(cfManager);   // viewPagerAdapter =新ViewPagerAdapter(getActivity()getSupportFragmentManager());
    viewPagerAdapter.addFragment(新EntertainmentWallpaperFragment(),的getString(R.string.title_entertainment_wallpapers));
    viewPagerAdapter.addFragment(新EntertainmentMusicFragment(),的getString(R.string.title_entertainment_music));
    viewPagerAdapter.addFragment(新EntertainmentGamesFragment(),的getString(R.string.title_entertainment_games));
    viewPagerAdapter.addFragment(新EntertainmentEBooksFragment(),的getString(R.string.title_entertainment_ebooks));
    viewPagerAdapter.addFragment(新EntertainmentAppsFragment(),的getString(R.string.title_entertainment_apps));
    viewPager.setAdapter(viewPagerAdapter);
}

我希望这有助于。我所在的片段apear同样的问题,但一旦你回去,他们dissapear并找到一个空fragent。 Commnented是我第一次实现了线,更新片段经理,我能够享受免费的平滑滚动。在

I have the same problem as Navigating back to FragmentPagerAdapter -> fragments are empty but would like some clarification on the solution of using getChildFragmentManager().

This solution uses getChildFragmentManager(), the manager for fragments inside this Fragment(OuterFragment, which has the viewpager). InnerFragment is a page inside OuterFragment. When someone clicks the listview in InnerFragment, I want InnerFragment2 to replace InnerFragment. What do the xml and fragment managers look like?

fragment_outer.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.view.ViewPager
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/vpPager"
    android:layout_height="wrap_content"
    android:layout_width="match_parent">

    <android.support.v4.view.PagerTabStrip
        android:id="@+id/pager_header"
        android:layout_gravity="top"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:paddingBottom="4dp"
        android:paddingTop="4dp" />

    <FrameLayout
        android:id="@+id/inner_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</android.support.v4.view.ViewPager>

OuterFragment.java:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

View v = inflater.inflate(R.layout.fragment_outer, container, false);
vpPager = (ViewPager) v.findViewById(R.id.vpPager);

FragmentManager cfManager = getChildFragmentManager();
adapterViewPager = new MyPagerAdapter(cfManager);

vpPager.setAdapter(adapterViewPager);
return v;
}

public static class MyPagerAdapter extends FragmentPagerAdapter {

public MyPagerAdapter(FragmentManager fragmentManager) {
    super(fragmentManager);
}

@Override
public int getCount() {
    return 2;
}

// Returns the fragment to display for that page
@Override
public Fragment getItem(int position) {
    switch (position) {
        case 0:
            return InnerFragment.newInstance(false);
        case 1:
            return InnerFragment.newInstance(true);
        default:
            return null;
    }
}

InnerFragment shows up as a fragment inside OuterFragment, which has the viewpager. InnerFragment has a listview that when clicked, should replace InnerFragment with InnerFragment2.

InnerFragment.java:

FragmentManager fm = getChildFragmentManager();
fm = fm.beginTransaction();
ft.addToBackStack(null);
ft = ft.replace(R.id.inner_content,
                InnerFragment2.newInstance(someArg));
ft.commit();

This throws an error saying InnerFragment2 does not recognize view R.id.inner_content.

Not only should InnerFragment2 replace InnerFragment, but when InnerFragment2 is shown and it's button is clicked, I want InnerFragment2 replaced with InnerFragment3. I basically want to use inner_content as an inner container and keep adding fragments to a backstack for appropriate back behavior.

Do I getChildFragmentManager() or getFragmentManager() each time I add to my fragment backstack, what does the xml pattern look like, because having one framelayout in my outerfragment isn't doing it.

解决方案

public void setupViewPager(ViewPager viewPager) {

    FragmentManager cfManager=getChildFragmentManager();
    viewPagerAdapter = new ViewPagerAdapter(cfManager);

   // viewPagerAdapter = new ViewPagerAdapter(getActivity().getSupportFragmentManager());
    viewPagerAdapter.addFragment(new EntertainmentWallpaperFragment(), getString(R.string.title_entertainment_wallpapers));
    viewPagerAdapter.addFragment(new EntertainmentMusicFragment(), getString(R.string.title_entertainment_music));
    viewPagerAdapter.addFragment(new EntertainmentGamesFragment(), getString(R.string.title_entertainment_games));
    viewPagerAdapter.addFragment(new EntertainmentEBooksFragment(), getString(R.string.title_entertainment_ebooks));
    viewPagerAdapter.addFragment(new EntertainmentAppsFragment(), getString(R.string.title_entertainment_apps));
    viewPager.setAdapter(viewPagerAdapter);
}

I hope this helps. I had the same problem where the fragments apear but once you go back they dissapear and find an empty fragent. Commnented the line that I had first implemented which after updating the fragment manager I was able to enjoy free smooth scroll.

这篇关于getChildFragmentManager()和viewpager的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆