gpt4 book ai didi

android - 滑动时 ViewPager 更新 fragment

转载 作者:IT老高 更新时间:2023-10-28 22:01:46 25 4
gpt4 key购买 nike

我有一个问题,过去 2 天我一直在努力解决。

我正在构建一个使用 ActionBar、ViewPager 和 FragmentPagerAdapter 的应用程序。Activity、Fragments 和 FragmentPagerAdapter 的代码与 http://developer.android.com/reference/android/support/v4/view/ViewPager.html 上的 android 示例中所述的完全相同。

我面临的问题是——假设我在 viewPager 中只有 2 个 fragment 。在两者之间切换/滑动时, fragment 没有得到更新。 onResume 不会被调用,因为 viewPager 在显示的 fragment 的任一侧缓存了至少 1 个 fragment 。

我尝试使用 onTabSelected 来检测何时选择了一个 fragment ,然后在接口(interface)的帮助下从该 fragment 启动一个方法(下面的代码)。

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。启动方法的代码是:

public void Start() {
TextView tv = _view.findViewById(R.id.text);
tv.setText("test");
}

在以下行抛出异常:

TextView tv = _view.findViewById(R.id.text);

IStartStop 接口(interface)非常简单:

public interface IStartStop {
public void Start();
public void Stop();
}

我不想使用 notifyDataSetChanged();使用 POSITION_NONE 因为每次我滑动到新 fragment 时,加载 fragment 需要几秒钟

此时的fragment只包含一个textview,以后会有动画,所以很重要:

1- 仅在选择 fragment 时运行动画,而不是在选择它旁边的 fragment 时运行动画(ViewPager 缓存和恢复 fragment 的方式)。

2- 当 fragment 不再被选中时停止动画以避免浪费设备资源。

是的,我已经检查了互联网上的所有可用内容,但似乎没有任何东西适合我。

非常感谢您的帮助!

最佳答案

令人惊讶的是,ViewPager 并没有“ native ”执行此操作(除其他外)。但并非全部丢失。

首先,您必须修改 fragment ,以便它们仅在您告诉它们可以运行时才运行动画,而不是在它们被实例化时运行。通过这种方式,您可以使用 viewpager 偏移量(默认 = 3)并预加载 2-3 个 fragment 但没有动画。

第二步是创建一个接口(interface)或类似的接口(interface)来定义“fragment 何时变得可见”。

第三步是将一个新的 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) 更改您的 fragment ,以便它们实现此功能:

public class YourLovelyFragment extends Fragment implements YourFragmentInterface {

4) 在 fragment 中实现接口(interface)

@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.
}

从这里到哪里去?

您可能希望实现一种方法/监听器来通知“其他” fragment 它们不再可见(即,当一个 fragment 可见时,其他 fragment 不可见)。但这可能不是必需的。

关于android - 滑动时 ViewPager 更新 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20412379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com