Android 在选项卡之间更改时刷新片段

Android 在选项卡之间更改时刷新片段,android,android-fragments,Android,Android Fragments,应用程序在第一个片段打开,有2个选项卡我想刷新第二个片段 当我移动到它,但我不想刷新第一个片段 主要活动 创建时受保护的void(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); toolbar=(toolbar)findviewbyd(R.id.toolbar); 设置支持操作栏(工具栏); viewPager=(viewPager)f

应用程序在第一个片段打开,有2个选项卡我想刷新第二个片段 当我移动到它,但我不想刷新第一个片段

主要活动
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar=(toolbar)findviewbyd(R.id.toolbar);
设置支持操作栏(工具栏);
viewPager=(viewPager)findViewById(R.id.viewPager);
设置viewPager(viewPager);
tabLayout=(tabLayout)findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
}
专用无效设置ViewPager(ViewPager ViewPager){
ViewPagerAdapter适配器=新的ViewPagerAdapter(getSupportFragmentManager());
addFragment(新的Main_按钮(),“Main”);
addFragment(新的TwoFragment(),“Main2”);
viewPager.setAdapter(适配器);
}
类ViewPagerAdapter扩展了FragmentPagerAdapter{
私有最终列表MFFragmentList=new ArrayList();
私有最终列表MFFragmentTitleList=new ArrayList();
公共视图页面编辑器(碎片管理器){
高级经理;
}
@凌驾
公共片段getItem(int位置){
返回MFFragmentList.get(位置);
}
@凌驾
public int getCount(){
返回MFFragmentList.size();
}
public void addFragment(片段片段,字符串标题){
添加(片段);
MFFragmentTitleList.add(标题);
}
@凌驾
公共字符序列getPageTitle(int位置){
返回MFFragmentTitleList.get(位置);
}
}

请解释您的答案,因为我是android新手,我不知道如何才能做到这一点,当
片段
可见时(即,您的
查看页面
中选择的页面),它的方法被调用。您可以在
TwoFragment
中重写该方法,并使用它触发刷新

public class TwoFragment extends Fragment {

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

如果您不介意每次选项卡更改时都刷新每个片段,您可以简单地重写FragmentPagerAdapter的
getItemPosition()
方法,并使其始终返回值
POSITION\u 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);
}

这些代码大部分来自于。

在片段类中,请使用以下代码:

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

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

从2020年起,建议使用LiveData和viewModel等体系结构组件(MVVM)

这样,所有片段都可以共享相同的状态


请参阅此处的文档

试试这个-它对我有用

当当前片段对用户可见时,此代码将重新加载该片段。在滑动和按下下一个碎片上的后退按钮时工作

@覆盖
public void setUserVisibleHint(布尔值为可见){
super.setUserVisibleHint(isVisible);
如果(可见){
FragmentTransaction ftr=getFragmentManager().beginTransaction();
ftr.detach(this.attach)(this.commit();
}

}
您可以使用ViewPager.addOnPageChangeListener在滑动片段时进行监听,并在片段中加入某种类型的操作。

很好的示例谢谢您该方法效果很好,但当我滑动tablayout和用户滑动在选项卡之间切换时,刷新会延迟,因为当它完全滑动到另一个片段时,它开始刷新视图。我注意到了,因为我有一个加载动画的圆形进度条,当我滑动时它看起来很愚蠢。我必须点击tablayout选项卡,然后它会很好地刷新。你知道怎么解决这个问题吗?我认为它需要销毁屏幕外的选项卡,然后它会很好地加载,但是如何加载呢?我已经尝试添加
else{getFragmentManager().beginTransaction().detach(this.commit());
但是当我滑动到另一个片段时,它会完全清空一秒钟,然后开始绘制所有视图……有什么想法可以解决它吗?很好的解决方案,但该方法现在已被弃用。你知道如何将用户可见性想法与新方法结合使用吗?根据弃用,你会想使用
onResume()
作为你的可视信号嗨,肖恩。虽然你的观点可能是准确的,但试着加入一个小代码片段,以便更好地理解答案。
ViewPager mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);