我有一个问题,我过去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-当不再选择片段时停止动画以避免浪费设备资源。
是的,我已经检查了互联网上的所有内容,但似乎没有任何关系。
非常感谢你的帮助!
答案 0 :(得分:54)
令人惊讶的是ViewPager
并没有做到这一点&#34;本地&#34; (除其他事项外)。但并非所有人都失去了。
首先,你必须修改你的片段,这样他们只有当你告诉他们它没有被实例化时才会运行动画。通过这种方式,您可以使用viewpager偏移量(默认值= 3)并预装2-3个片段,但不会设置动画。
第二步是创建一个界面或类似的界面来定义&#34;片段何时变得可见&#34;。
第三步是将新的OnPageScrollListener附加到您的viewpager。
代码如下(在半未经测试的代码中):
1)附上听众:
mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(final int i, final float v, final int i2) {
}
@Override
public void onPageSelected(final int i) {
YourFragmentInterface fragment = (YourFragmentInterface) mPagerAdapter.instantiateItem(mViewPager, i);
if (fragment != null) {
fragment.fragmentBecameVisible();
}
}
@Override
public void onPageScrollStateChanged(final int i) {
}
});
2)这是你的界面:
public interface YourFragmentInterface {
void fragmentBecameVisible();
}
3)更改你的片段,以便他们实现这个:
public class YourLovelyFragment extends Fragment implements YourFragmentInterface {
4)在片段
中实现接口@Override
public void fragmentBecameVisible() {
// You can do your animation here because we are visible! (make sure onViewCreated has been called too and the Layout has been laid. Source for another question but you get the idea.
}
从哪里开始?
您可能希望实现一个方法/监听器来通知&#34;其他&#34;它们不再可见的碎片(即当一个可见时,其他则不可见)。但这可能不需要。
答案 1 :(得分:4)
这将影响视图寻呼机中从一个页面到另一个页面的更改。
OnPageChangeListener pagechangelistener =new OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
Logger.logMessage("Called first");
pageAdapter.notifyDataSetChanged();
indicator.setCurrentItem(arg0);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
Logger.logMessage("Called second");
}
@Override
public void onPageScrollStateChanged(int arg0) {
Logger.logMessage("Called third");
}
};
myViewPager.setOnPageChangeListener(pagechangelistener);
在页面适配器中使用此功能。
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
答案 2 :(得分:2)
已弃用setOnPageChangeListener。相反,您应该使用addOnPageChangeListener。
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(final int i, final float v, final int i2) {
}
@Override
public void onPageSelected(final int i) {
YourFragmentInterface fragment = (YourFragmentInterface) mPagerAdapter.instantiateItem(mViewPager, i);
if (fragment != null) {
fragment.fragmentBecameVisible();
}
}
@Override
public void onPageScrollStateChanged(final int i) {
}
});
答案 3 :(得分:-7)
定义Viewpager时添加此代码
mViewPager.setOffscreenPageLimit(0);
切换到其他片段时,它不会保存片段的任何视图..因此从片段切换到另一片段将从开始创建片段并更新所有片段。