在我滑动之前,ViewPager标题不会出现

时间:2015-09-01 04:31:40

标签: java android android-studio android-viewpager

我正在学习使用ViewPager和PagerTabStrip来实现导航栏。我已经实现了它,我的问题是:每次我打开应用程序时,标题都没有显示,但是在我刷了一次后,标题全部再次出现,然后一切正常。 代码如下所示:

自定义适配器

public class MyPagerAdapter extends PagerAdapter {
    private List<View> viewList;
    private List<String> titleList;

    public MyPagerAdapter(List<View> viewList, List<String> titleList){
        this.viewList = viewList;
        this.titleList = titleList;
    }

    @Override
    public int getCount() {
        return viewList.size();
    }

    @Override
    public boolean isViewFromObject(View view, Object o) {
        return view == o;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        container.addView(viewList.get(position));
        return viewList.get(position);
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView(viewList.get(position));
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return titleList.get(position);
    }
}

.xml文件:

<android.support.v4.view.ViewPager
    android:id="@+id/viewPager"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center">

    <android.support.v4.view.PagerTabStrip
        android:id="@+id/tab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        />

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

这是“只需点击应用图标”的屏幕截图: enter image description here

这是在我刷到第二页之后: enter image description here

我真的很沮丧。谢谢!

4 个答案:

答案 0 :(得分:12)

这是com.android.support:appcompat-v7:23.0.0 中出现的问题。你可以在这里参考https://code.google.com/p/android/issues/detail?id=183127

在该链接中,谷歌支持团队已经提到在将来的版本中将修复缺陷。 所以现在解决方案是使用com.android.support构建项目:appcompat-v7:22.2.1

更新:如果可行,那么您可以继续使用@nidheeshdas提供的其他解决方案。我试过简单的项目;它的工作 在活动的onResume()内修改了@nidheeshdas的解决方案

public override void Draw (CoreGraphics.CGRect rect)
        {
            base.Draw (rect);
            using (CGContext g = UIGraphics.GetCurrentContext ()) {

                UIBezierPath completePath = UIBezierPath.Create ();

                g.ScaleCTM (1, -1);
                g.TranslateCTM (2, -(this.Bounds.Height / 2) - (this.Font.LineHeight / 3));

                CTLine line = new CTLine (this.AttributedText);
                CTRun[] runs = line.GetGlyphRuns ();

                for (int i = 0; i < runs.Length; i++) {

                    CTRun run = runs [i];
                    CTFont font = run.GetAttributes ().Font;

                    for (int j = 0; j < run.GlyphCount; j++) {

                        NSRange currentRange = new NSRange (j, 1);
                        CGPoint[] positions = run.GetPositions (currentRange); 
                        ushort[] glyphs = run.GetGlyphs (currentRange);

                        CGPath letter = font.GetPathForGlyph (glyphs [0]);
                        CGAffineTransform transform = CGAffineTransform.MakeTranslation (positions [0].X, positions [0].Y);

                        CGPath path = new CGPath (letter, transform);
                        UIBezierPath newPath = UIBezierPath.FromPath (path);
                        completePath.AppendPath (newPath);
                    }
                }


                completePath.LineWidth = 1;

                UIColor.Red.SetStroke ();
                UIColor.Blue.SetFill ();
                completePath.Stroke ();
                completePath.Fill ();


                completePath.ClosePath ();

                //Here I will try to loop over my current points and go down & right at every step of the loop, see how it goes performance-wise. Instead of one complex drawing I'll just have a very simple drawing that has thousands of points :o
                g.AddPath (completePath.CGPath);
                g.DrawPath (CGPathDrawingMode.FillStroke);

            }

新更新:正如上面的google问题跟踪链接和JP Ventura的评论所述。我尝试过新版本的库,问题似乎已得到解决。

答案 1 :(得分:2)

使用 android.support.design.widget.TabLayout ,而不是使用 android.support.v4.view.PagerTabStrip 用于显示viewPager的标签。它包含在Google Design Support Library中。

有关详细信息,请参阅此链接 http://android-developers.blogspot.in/2015/05/android-design-support-library.html

只需几行:

viewPager=(ViewPager)v.findViewById(R.id.viewPager);

ViewPagerAdapter adapter=new ViewPagerAdapter(this.getChildFragmentManager(),doctor);
adapter.setViewPagerFragmentListener(this);
viewPager.setAdapter(adapter);

tabLayout.setupWithViewPager(viewPager);  //Sync Tabs with viewPager
tabLayout.setTabsFromPagerAdapter(adapter);  //Setup tabs titles 

要更改标题,请使用ViewPagerAdapter中的以下代码

@Override
public CharSequence getPageTitle(int position) {
    switch (position){
        case 0:
            return "Title 1";
        case 1:
            return "Title 2";
        case 2:
            return "Title 3";
    }
    return super.getPageTitle(position);
}

答案 2 :(得分:1)

我最近也开始遇到这个问题,经过一些测试后,我发现我发现了Android最新支持包更新中的一个错误。

问题出现在 com.android.support:appcompat-v7:23.0.0 中。

尝试将依赖关系更改回 com.android.support:appcompat-v7:22.2.1 (第二次最新更新),看看是否有效。

不幸的是,我还没有找到任何解决方案来使其与最新的支持包更新一起使用。

答案 3 :(得分:1)

试试这个。它似乎对我有用。

@Override
protected void onResume() {
    super.onResume();
    pager.setCurrentItem(1);
    Task.delay(500).continueWith(new Continuation<Void, Object>() {
        @Override
        public Object then(Task<Void> task) throws Exception {
            pager.setCurrentItem(0);
            return null;
        }
    }, Task.UI_THREAD_EXECUTOR);
}

onResume将寻呼机设置为1,然后再设置为0.这使得标题显示为第一次加载页面。