【问题标题】:Refresh fragment when change between tabs在选项卡之间更改时刷新片段
【发布时间】:2021-05-13 13:22:06
【问题描述】:

应用程序在第一个片段上打开,有 2 个标签我想刷新第二个片段 当我移动到它但我不想刷新第一个片段时

主要活动

protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    viewPager = (ViewPager) findViewById(R.id.viewpager);
    setupViewPager(viewPager);
    tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);

}
private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new Main_Button(), "Main");
    adapter.addFragment(new TwoFragment(), "Main2");
    viewPager.setAdapter(adapter);
}

class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

请解释你的答案,因为我是 android 新手,我不知道该怎么做

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    Fragment 可见时(即ViewPager 中的选定页面),将调用其setUserVisibleHint() 方法。您可以在 TwoFragment 中覆盖该方法并使用它来触发刷新。

    public class TwoFragment extends Fragment {
    
      @Override
      public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
          // Refresh your fragment here
        }
      }
    

    【讨论】:

    • 很好的例子谢谢你
    • 这种方法效果很好,除了,例如,当我滑动标签布局和用户滑动以在标签之间切换时,刷新会有延迟,因为它在完全滑动到时开始刷新视图另一个片段。我注意到这是因为我有带有加载动画的圆形进度条,当我滑动时它看起来很愚蠢。我必须点击 tablayout 选项卡,然后它会很好地刷新。知道如何解决这个问题吗?我认为它需要销毁屏幕外的标签,然后它会很好地加载,但是如何?
    • 我尝试添加else{ getFragmentManager().beginTransaction().detach(this).commit();,但是当我滑动到其他片段时,它一秒钟完全是空的,然后它开始绘制所有视图....任何想法如何解决它?
    • 很好的解决方案,但该方法现在已弃用。您知道如何将用户可见性理念与更新的方法结合使用吗?
    • 根据弃用,您需要使用 onResume() 作为您可见的信号
    【解决方案2】:

    在您的片段类中使用以下代码:

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
            getFragmentManager().beginTransaction().detach(this).attach(this).commit();
        }
    }
    

    【讨论】:

      【解决方案3】:

      试试这个

      ViewPager mViewPager = (ViewPager)findViewById(R.id.pager);
      mViewPager.setOffscreenPageLimit(2); 
      

      【讨论】:

        【解决方案4】:

        从 2020 年起,建议使用架构组件 (MVVM),例如 LiveData 和 viewModel

        这样所有的 Fragment 可以共享相同的状态

        在此处查看文档https://developer.android.com/jetpack/guide

        【讨论】:

          【解决方案5】:

          试试这个 - 它对我有用

          此代码在用户可见时重新加载当前片段。在下一个片段上滑动和按下后退按钮时有效。

          @Override
              public void setUserVisibleHint(boolean isVisible) {
                  super.setUserVisibleHint(isVisible);
                  if (isVisible) {
                          FragmentTransaction ftr = getFragmentManager().beginTransaction();
                          ftr.detach(this).attach(this).commit();
                  }
              }

          【讨论】:

            【解决方案6】:

            如果您不介意在每次选项卡更改时刷新每个片段,您可以简单地覆盖 FragmentPagerAdapter 的 getItemPosition() 方法并使其始终返回值 POSITION_NONE。示例:

            @Override
            public int getItemPosition(Object object) {
               return POSITION_NONE;
            }
            

            通过这样做,您告诉 android 在每次视图寻呼机尝试获取片段时刷新片段。性能方面,这不是最佳实践。所以还有第二种方法:

            首先,创建一个需要刷新时调用的接口:

            public interface Updatable {
               public void update();
            }
            

            然后,让你的片段实现这个接口:

            public class MyFragment extends Fragment implements Updateable {
            
               ...
            
               @Override
               public void update() {
                 // refresh your fragment, if needed
               }
            }
            

            如果您真的希望更新您的第一个片段,请在其update() 方法中不执行任何操作。

            第三,重写getItemPosition方法并调用update()。每次选择片段时都会调用它:

            @Override
            public int getItemPosition(Object object) {
               Updatable f = (Updatable) object;
               if (f != null) {
                  f.update();
               }
              return super.getItemPosition(object);
            }
            

            大部分代码来自this answer

            【讨论】:

              【解决方案7】:

              您可以使用 ViewPager.addOnPageChangeListener 来监听片段何时被滑动并在那里合并某种类型的操作。

              【讨论】:

              • 你好,肖恩。虽然您提出的观点可能是准确的,但请尝试包含一个小代码 sn-p 以便更好地获得答案。
              猜你喜欢
              • 1970-01-01
              • 2013-10-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多