我有一个问题,我过去2天一直在努力 .
我正在构建一个使用ActionBar,ViewPager和FragmentPagerAdapter的应用程序 . Activity,Fragments和FragmentPagerAdapter的代码与http://developer.android.com/reference/android/support/v4/view/ViewPager.html上的android示例中所述的完全相同
我面临的问题是 - 假设我在viewPager中只有2个片段 . 当在两者之间切换/滑动时,片段不会更新 . onResume不会被调用,因为viewPager将至少1个片段缓存到显示片段的任一侧 .
我尝试使用onTabSelected来检测何时选择了一个片段,然后在接口的帮助下从该片段启动一个方法(下面的代码) .
public void onTabSelected(Tab tab, FragmentTransaction ft) {
TabInfo tag = (TabInfo)tab.getTag();
for (int i=0; i<mTabs.size(); i++) {
if (mTabs.get(i) == tag) {
mViewPager.setCurrentItem(i);
}
}
((IStartStop)getItem(tab.getPosition())).Start();
}
但是,使用Start方法时,尝试更新textview时会触发NullPointerException . start方法的代码是:
public void Start() {
TextView tv = _view.findViewById(R.id.text);
tv.setText("test");
}
在行中抛出异常:
TextView tv = _view.findViewById(R.id.text);
IStartStop界面非常简单:
public interface IStartStop {
public void Start();
public void Stop();
}
我不想使用notifyDataSetChanged();使用POSITION_NONE因为每次我刷到一个新的片段,加载片段需要几秒钟
此时,片段只包含一个textview,将来他们会有一个动画,所以重要的是:
1-仅在选择片段时运行动画,而不是在选择其旁边的片段时运行动画(ViewPager缓存和恢复片段的方式) .
2-当不再选择片段时停止动画以避免浪费设备资源 .
是的,我已经检查了互联网上的所有可用内容,但似乎没有任何关系 .
非常感谢您的帮助!
4 回答
令人惊讶的是
ViewPager
并没有这样做"natively"(除其他外) . 但并非所有人都失去了 .首先,您必须修改片段,以便它们只在您告诉它们没有实例化时才会运行动画 . 通过这种方式,您可以使用viewpager偏移量(默认值= 3)并预装2-3个片段,但不会设置动画 .
第二步是创建一个定义“片段何时可见”的界面或类似物 .
第三步是将新的OnPageScrollListener附加到您的viewpager .
代码如下(在半未经测试的代码中):
1)附加监听器:
2)这是你的界面:
3)更改你的片段,以便他们实现这个:
4)在片段中实现接口
Where to go from here?
您可能希望实现一个方法/侦听器来通知“其他”片段它们不再可见(即,一个可见,其他则不可见) . 但这可能不需要 .
这将影响视图寻呼机中从一个页面到另一个页面的更改 .
在页面适配器中使用它 .
setOnPageChangeListener已被弃用 . 相反,您应该使用addOnPageChangeListener .
定义Viewpager时添加此代码
切换到其他片段时,它不会保存片段的任何视图..因此从片段切换到另一个片段将从开始创建片段并更新所有片段 .