Ste*_*eve 27 android refresh exception fragment android-viewpager
我有一个问题,我过去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();
}
Run Code Online (Sandbox Code Playgroud)
但是,使用Start方法时,尝试更新textview时会触发NullPointerException.start方法的代码是:
public void Start() {
TextView tv = _view.findViewById(R.id.text);
tv.setText("test");
}
Run Code Online (Sandbox Code Playgroud)
在行中抛出异常:
TextView tv = _view.findViewById(R.id.text);
Run Code Online (Sandbox Code Playgroud)
IStartStop界面非常简单:
public interface IStartStop {
public void Start();
public void Stop();
}
Run Code Online (Sandbox Code Playgroud)
我不想使用notifyDataSetChanged(); 使用POSITION_NONE因为每次我刷到一个新的片段,加载片段需要几秒钟
此时,片段只包含一个textview,将来他们会有一个动画,所以重要的是:
1-仅在选择片段时运行动画,而不是在选择其旁边的片段时运行动画(ViewPager缓存和恢复片段的方式).
2-当不再选择片段时停止动画以避免浪费设备资源.
是的,我已经检查了互联网上的所有可用内容,但似乎没有任何关系.
非常感谢您的帮助!
Mar*_*ini 55
令人惊讶的是,ViewPager
这并不是"本地"(除此之外).但并非所有人都失去了.
首先,您必须修改片段,以便它们只在您告诉它们没有实例化时才会运行动画.通过这种方式,您可以使用viewpager偏移量(默认值= 3)并预装2-3个片段,但不会设置动画.
第二步是创建一个定义"片段何时可见"的界面或类似物.
第三步是将新的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) {
}
});
Run Code Online (Sandbox Code Playgroud)
2)这是你的界面:
public interface YourFragmentInterface {
void fragmentBecameVisible();
}
Run Code Online (Sandbox Code Playgroud)
3)更改你的片段,以便他们实现这个:
public class YourLovelyFragment extends Fragment implements YourFragmentInterface {
Run Code Online (Sandbox Code Playgroud)
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.
}
Run Code Online (Sandbox Code Playgroud)
然后去哪儿?
您可能希望实现一个方法/侦听器来通知"其他"片段它们不再可见(即,一个可见,其他不可见).但这可能不需要.