为什么它是不可能使用ViewPager一个片段内?它实际上是 [英] Why it is not possible to use ViewPager within a Fragment? It actually is

查看:137
本文介绍了为什么它是不可能使用ViewPager一个片段内?它实际上是的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有信息,这是不可能使用 ViewPager 片段在许多来源,如的忙碌codeRS指南Android开发由马克·墨菲,或帖子像<一个href="http://stackoverflow.com/questions/7700226/display-fragment-viewpager-within-a-fragment/">this在左右。我很困惑,因为我没有这样的问题,我成功地使用 ViewPager 我的片段之内。唯一的区别是,我实例化一个 ViewPager 不是 onCreateView()的方法,但在 onActivityCreated ()。所有的一切都运行完美。

所以,问题是 - 可能是我不知道的东西,这是不推荐出于某种原因,使UI实例在 onActivityCreated()?但同样 - 一切都工作得很好

下面是类和XML的清单:

类:

 公共类ViewPagerFragment扩展片段{

    静态最终诠释NUM_ITEMS = 2;

    私人ViewPagerAdapter mAdapter;
    私人ViewPager mPager;

    @覆盖
    公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,捆绑savedInstanceState){
        返回inflater.inflate(R.layout.view_pager_fragment,集装箱,假);
    }

    @覆盖
    公共无效onActivityCreated(包savedInstanceState){
        super.onActivityCreated(savedInstanceState);

        mAdapter =新ViewPagerAdapter(getFragmentManager());

        mPager =(ViewPager)getView()findViewById(R.id.pager)。
        mPager.setAdapter(mAdapter);
    }

    公共静态类ViewPagerAdapter扩展FragmentPagerAdapter {
        公共ViewPagerAdapter(FragmentManager FM){
            超(FM);
        }

        @覆盖
        公共片段的getItem(INT NUM){
            如果(NUM == 0){
                返回新ItemsListFragment();
            } 其他 {
                返回新FavsListFragment();
            }
        }

        @覆盖
        公众诠释getCount将(){
            返回NUM_ITEMS;
        }
    }
}
 

布局:

 &LT; LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
              机器人:layout_width =FILL_PARENT
              机器人:layout_height =FILL_PARENT
              机器人:方向=垂直&GT;

    &LT; android.support.v4.view.ViewPager
        机器人:ID =@ + ID /寻呼机
        机器人:layout_width =FILL_PARENT
        机器人:layout_height =0dp
        机器人:layout_weight =1/&GT;

&LT; / LinearLayout中&GT;
 

解决方案

更新:既然这个答案最初写,你现在可以有嵌套的片段,这意味着它可能有一个 ViewPager 使用页面片段的的是一个片段本身。 演示该技术示例项目。

我现在返回到你的正常计划的答案,psented其全部$ P $ ...


引用自己从书:

  

使用ViewPager最简单的方法是把它页面片段进出的   屏幕根据用户刷卡。这仅当ViewPager本身不包含工作   一个片段中,你可以不必片段嵌套在其他片段中。

引述戴安娜Hackborn 的:

  

目前不支持嵌套的片段。试图把片段另一个片段的UI中会导致不确定的,并可能打破的行为。

这是完全有可能把一个 ViewPager 片段,只要内容<在 ViewPager的/ EM> 本身并不包含片段的。由于 PagerAdapter 的具体实现由支持Android包使用的片段提供,你要滚你自己的片段少 PagerAdapter ViewPager 中的片段。

我将努力使这一点更清楚在书的下一个版本(除非你是英国人,在这种情况下,我会努力使这一点更为清晰: - )。

There are information that it is impossible to use ViewPager within a Fragment in many sources like "The Busy Coders Guide for Android Developers" by Mark Murphy, or posts like this on SO. I'm confused because I don't have such a problem and I successfully use ViewPager within my Fragment. The only distinction is that I instantiate a ViewPager not in onCreateView() method but in onActivityCreated(). And everything works perfectly fine.

So the question is - may be I just don't know something and this is not recommended for some reason to make UI instantiations in onActivityCreated()? But again - everything works just fine.

Here is the listing of the class and xml:

Class:

public class ViewPagerFragment extends Fragment {

    static final int NUM_ITEMS = 2;

    private ViewPagerAdapter mAdapter;
    private ViewPager mPager;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.view_pager_fragment, container, false);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        mAdapter = new ViewPagerAdapter(getFragmentManager());

        mPager = (ViewPager) getView().findViewById(R.id.pager);
        mPager.setAdapter(mAdapter);
    }

    public static class ViewPagerAdapter extends FragmentPagerAdapter {
        public ViewPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int num) {
            if (num == 0) {
                return new ItemsListFragment();
            } else {
                return new FavsListFragment();
            }
        }

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

Layout:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:orientation="vertical">

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

</LinearLayout>

解决方案

UPDATE: Since this answer was originally written, you now can have nested fragments, which means it is possible to have a ViewPager use fragments for pages and be in a fragment itself. This sample project demonstrates the technique.

I now return you to your regularly-scheduled answer, presented in its entirety...


Quoting myself from the book:

The simplest way to use a ViewPager is to have it page fragments in and out of the screen based on user swipes. This only works if the ViewPager itself is not contained within a fragment, as you cannot have fragments nested inside of other fragments.

Quoting Dianne Hackborn:

Nested fragments are not currently supported. Trying to put a fragment within the UI of another fragment will result in undefined and likely broken behavior.

It is perfectly possible to put a ViewPager inside a Fragment, so long as the contents of the ViewPager do not themselves contain fragments. Since the concrete implementations of PagerAdapter supplied by the Android Support package use fragments, you have to roll your own fragment-less PagerAdapter to put the ViewPager in a fragment.

I will endeavor to make this point clearer in the next edition of the book (unless you're British, in which case I'll endeavour to make this point clearer :-).

这篇关于为什么它是不可能使用ViewPager一个片段内?它实际上是的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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