我有一个viewpager的活动,它有3个标签和3个片段,每个标签内都有一个片段。我知道片段管理器存储了片段的初始实例,因此如果我从选项卡上滑动然后返回到该选项卡,它将被加载到内存中,并且不会对其应用任何更新。
我需要发生相反的情况,即:每当我滑动到选项卡时,需要加载该选项卡中片段的新实例,以便更新数据。
我试过了:
- 在onTabSelected中分离附加片段(没有任何反应)
- 删除onTabSelected中的添加片段(没有任何反应)
- setOffscreenPageLimit(0)(没有任何反应)
- 刷新功能 在每个片段里面调用onTabSelected(给出 的NullPointerException)
醇>
我一直在努力解决这个问题一周没有进展。我感谢任何帮助,无论是提示,评论还是建议。
让我知道我应该发布什么代码,谢谢。
答案 0 :(得分:22)
我知道答案很古老,但...... 我找到了解决方案。我不知道它是否是最好的,但就我而言,已经解决了。
活动:
@Override
public void onTabSelected(ActionBar.Tab tab,
FragmentTransaction fragmentTransaction) {
// When the given tab is selected, switch to the corresponding page in
// the ViewPager.
mViewPager.setCurrentItem(tab.getPosition());
if (tab.getPosition() == 0) {
LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);
Intent i = new Intent("TAG_REFRESH");
lbm.sendBroadcast(i);
}
}
你的碎片:
public class MyFragment extends Fragment {
MyReceiver r;
public void refresh() {
//yout code in refresh.
Log.i("Refresh", "YES");
}
public void onPause() {
super.onPause();
LocalBroadcastManager.getInstance(context).unregisterReceiver(r);
}
public void onResume() {
super.onResume();
r = new MyReceiver();
LocalBroadcastManager.getInstance(context).registerReceiver(r,
new IntentFilter("TAG_REFRESH"));
}
private class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
MyFragment.this.refresh();
}
}
答案 1 :(得分:4)
我会使用类似于以下内容的东西:
public class MainActivity extends FragmentActivity implements ActionBar.TabListener {
private ViewPager ViewPager;
private TabsPagerAdapter SectionsPagerAdapter;
private ActionBar actionBar;
private String[] tabs = { "Event Details", "Line-up", "Donations", };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Initialisation
ViewPager = (ViewPager) findViewById(R.id.pager);
actionBar = getActionBar();
SectionsPagerAdapter = new TabsPagerAdapter(getSupportFragmentManager());
ViewPager.setAdapter(SectionsPagerAdapter);
actionBar.setHomeButtonEnabled(false);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
// Adding Tabs
for (String tab_name : tabs) {
actionBar.addTab(actionBar.newTab().setText(tab_name).setTabListener(this));
}
ViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
// on changing the page
// make respected tab selected
actionBar.setSelectedNavigationItem(position);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
}
@Override
public void onTabReselected(Tab tab, android.app.FragmentTransaction ft) {
}
@Override
public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {
ViewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) {
}
//Attaching the fragments to the tabPagerAdapter
public class TabsPagerAdapter extends FragmentPagerAdapter {
public TabsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int index) {
switch (index) {
case 0:
return new EventFragment();
case 1:
// Points to the Lineup class
return new LineupFragment();
case 2:
// Points to the
return new DonationFragment();
case 3:
return new ConcertFragment();
}
return null;
}
@Override
public int getCount() {
// get item count - equal to number of tabs
return 4;
}
}
//Add your fragments here
希望这可以帮助你:)
答案 2 :(得分:0)
这是最紧凑的方法,仅触及Fragment类中的单个方法:
public class MyFragment extends Fragment {
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// Refresh tab data:
if(getFragmentManager() != null) {
getFragmentManager()
.beginTransaction()
.detach(this)
.attach(this)
.commit();
}
}
}
答案 3 :(得分:0)
请尝试以下鳕鱼:
@Override
public void setMenuVisibility(boolean visible) {
super.setMenuVisibility(visible);
if (isVisible()) {
//refresh your page
}
}