Android Studio - 选项卡式活动如何将片段重置为默认视图?

Posted

技术标签:

【中文标题】Android Studio - 选项卡式活动如何将片段重置为默认视图?【英文标题】:Android studio - tabbed activity how to reset fragment to default view? 【发布时间】:2018-02-09 16:41:06 【问题描述】:

我有一个片段,其中包含三个(默认)图像,当用户单击它们时,它们将变为另一个。但是,当我滑动到另一个片段并返回到带有图像的片段时,没有像开始那样默认的片段。当我滑动两次时,我将传递给另一个片段(与原始图像的距离为 2 个片段)图像被重置为默认值。我试图从 ViewPager 实现 setOffscreenPageLimit() 并将其设置为 1,但是当片段中的视图被重置时,最小“长度”为 2。如何在滑动操作后手动将图像更改为默认值?谢谢。

编辑:我认为onResume() 在这里不起作用的问题:Fragment onResume not called

但我不知道这意味着什么:/ 我有三个类 FragmentController.class、PagerAdapter.class 和特定片段的类,例如 FirstFragment.class。我不知道如何将这些类连接在一起。

【问题讨论】:

重置onResume方法的视图 onResume 无法正常工作我在触发时打印但只有当我从第一个片段滑动到第二个片段时才会触发(第三个是我想要重置的带有图像的片段)当然我在第三个片段类中有 onResume() 方法。 【参考方案1】:

检查您是否在适配器的 getItem() 方法中创建了片段,并且不持有对该片段的任何引用(必要时仅使用 Wea​​kReferences),否则无法销毁片段。

编辑:

第一个片段仅在您处于第三个片段时才会被卸载,因为 setOffscreenPageLimit 至少为 1,因此 viewpager 总是会加载位于所选片段两侧的片段。

您可以做的是使用此代码更新您的适配器以提供 getFragment(position) 方法:

private HashMap<Integer, WeakReference<Fragment>> fragmentReferences = new HashMap<>();

@Override
public Fragment getItem(int position) 
    Fragment fragment;
    switch (position) 
        case 0:
            fragment = FirstFragment.newInstance();
            break;
        // etc
    
    fragmentReferences.put(position, new WeakReference<>(fragment));
    return fragment;


public Fragment getFragment(int position) 
    WeakReference<Fragment> ref = fragmentReferences.get(position);
    return ref == null ? null : ref.get();

之后你就可以获取选中的fragment,并在页面被选中时从第一个fragment调用你想要的方法:

viewPager.setOnPageChangeListener(new OnPageChangeListener() 
    @Override
    public void onPageSelected(int currentPage) 
        if (currentPage == 0) 
            Fragment firstFragment = adapter.getFragment(0);
            if (firstFragment != null) 
                // This method resets the images of the first fragment
                ((FirstFragment) firstFragment).reset();
            
        
    

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) 
        // Do nothing
    

    @Override
    public void onPageScrollStateChanged(int state) 
        // Do nothing
    
);

【讨论】:

getItem 切换位置并在实际位置返回 FirstFragment.newInstance(); (FirstFragment 是实际片段的类) 在getItem方法的开头添加一些日志或者断点,从第三个片段滑动到第二个片段。正在为第一个位置调用 getItem() 并返回这个新实例? 我在 getItem 中返回 newInstance 之前添加了打印,并且每个案例(片段)在我再次刷卡时创建时打印一次,没有任何内容再次打印,所以你可以刷多少你想要的但每个 newInstance只调用一次。 那么 getItem(position) 呢?从第 3 个片段滑动到第 2 个片段时,是否以位置 0 作为参数调用它? 它打印位置很好,但只有一次与之前的调试相同。

以上是关于Android Studio - 选项卡式活动如何将片段重置为默认视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何在选项卡式活动中设置片段从右到左开始

Android:单击按钮时默认选项卡式活动不会启动

Android - 选项卡式片段

选项卡式活动中未显示工具栏标题

如何在 Android Studio 的 datasnapshot/recyclerview 中创建条件?

如何使用列表视图在选项卡式活动的片段中呈现 SQLite 表数据 [重复]