【问题标题】:Why doesn't my viewpager work in a Fragment?为什么我的 viewpager 不能在 Fragment 中工作?
【发布时间】:2012-08-28 20:46:49
【问题描述】:

我的片段有以下代码。我几乎从一个基本的视图寻呼机示例中获取了它,并将它拍成一个片段来测试我正在从事的项目。

我正在使用 ACtionBarSherlock 和 viewPagerIndicator 库。下面的 Fragment 包含一个 viewPager,在这个例子中应该在简单的标题字符串之间滑动。

我在活动中尝试了 ViewPager 和 ViewPagerIndicator 的示例,没有问题。但第二次我把它变成了一个片段。 BOOM,只有黑屏……没有错误,只是黑屏……我觉得我一定是在膨胀,或者访问布局不正确或什么的…… 有什么想法吗?

代码如下:

public class TestFragment extends SherlockFragment {

    //~Constants----------------------------------------------


    //~Data Fields--------------------------------------------

    //~Constructors--------------------------------------------
    @Override
    public void onCreate(Bundle savedInstanceState) {

        //Setup view
        super.onCreate(savedInstanceState);
        View view = onCreateView(getLayoutInflater(savedInstanceState), null, savedInstanceState);

        ViewPagerAdapter adapter = new ViewPagerAdapter( this.getSherlockActivity() );
        ViewPager pager = 
            (ViewPager)view.findViewById(R.id.free_time_day_pager);
        TitlePageIndicator indicator = 
            (TitlePageIndicator)view.findViewById(R.id.titles);
        pager.setAdapter( adapter );
        indicator.setViewPager( pager );
    }

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

        View view = inflater.inflate(R.layout.free_time_fragment_layout, null, false);
        return view;
    }

    //~Methods-------------------------------------------------
}

【问题讨论】:

    标签: android android-fragments android-viewpager actionbarsherlock viewpagerindicator


    【解决方案1】:

    不要打电话给onCreateView,这是错误的。

    onCreateView 是一个被FragmentManger 调用以处理Fragment 生命周期的重写方法。

    private ViewPager mViewPager;
    private TitlePagerIndicator mIndicator;
    
    // Called first
    @Override
    public void onCreate(Bundle savedInstanceState) {
        //Setup view
        super.onCreate(savedInstanceState);
    }
    
    // Called second
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    
        View view = inflater.inflate(R.layout.free_time_fragment_layout, null, false);
        return view;
    }
    
    // Called third
    @Override
    public View onViewCreated(View v){
        super.onViewCreated(v);
        mViewPager = (ViewPager) v.findViewById(R.id.free_time_day_pager);
        mIndicator = (TitlePageIndicator)v.findViewById(R.id.titles);
    
    }
    
    
    public void onActivityCreated(Bundle bdl){
        super.onActivityCreated(bdl);
        ViewPagerAdapter adapter = new ViewPagerAdapter( getSherlockActivity() );
        mViewPager.setAdapter(adapter);
        mIndicator.setViewPager(pager);
    }
    

    另外请注意,如果您使用的是 FragmentPagerAdapter,则需要一种特殊的方法来创建 ViewPagerFragment,这有点棘手,但请参阅gist.

    也阅读Fragment Lifecycles here

    干杯

    【讨论】:

    • !!!您先生让我对这个碎片业务大开眼界!太感谢了!现在我可以在我的应用程序中实施这个策略,让它看起来不再丑陋了!!
    • 它们是前进的方向,所以请使用它们。使手机和平板电脑的布局变得更加容易。也将它们用于对话框,使维护对话框生命周期变得更加容易。 developer.android.com/reference/android/app/…
    【解决方案2】:

    使用这个。

    compile 'com.android.support:appcompat-v7:23.0.1'
    

    为我工作。

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关 why 和/或 如何 此代码回答问题的额外上下文将显着改善其长期-期限价值。请edit你的答案添加一些解释。
    • 我的问题早于 gradle,但我很高兴看到今天的工具已经回答了这个问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    相关资源
    最近更新 更多