App在第一个片段上打开,有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的新手,我不知道我该怎么做
答案 0 :(得分:33)
当Fragment
可见时(即ViewPager
中的所选页面),会调用其setUserVisibleHint()方法。您可以在TwoFragment
中覆盖该方法,并使用它来触发刷新。
public class TwoFragment extends Fragment {
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// Refresh your fragment here
}
}
答案 1 :(得分:21)
在您的片段类中使用以下代码:
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
getFragmentManager().beginTransaction().detach(this).attach(this).commit();
}
}
答案 2 :(得分:1)
试试这个
ViewPager mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);
答案 3 :(得分:1)
试试这个 - 它对我有用
此代码在用户可见时重新加载当前片段。在滑动时和在下一个片段上按下后退按钮时有效。
@Override
public void setUserVisibleHint(boolean isVisible) {
super.setUserVisibleHint(isVisible);
if (isVisible) {
FragmentTransaction ftr = getFragmentManager().beginTransaction();
ftr.detach(this).attach(this).commit();
}
}
答案 4 :(得分:0)
如果您不介意每次更改选项卡时刷新每个片段,您可以简单地覆盖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。
答案 5 :(得分:0)
从2020年开始,建议使用LiveData和viewModel等架构组件(MVVM)
这样,所有片段都可以共享同一状态
答案 6 :(得分:0)
您可以使用 ViewPager.addOnPageChangeListener 来监听片段何时被滑动并在那里合并某种类型的操作。