我正在学习使用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>
我真的很沮丧。谢谢!
答案 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.这使得标题显示为第一次加载页面。