Android如何停止刷新选项卡上的碎片更改

我有以下代码:

MainActivity.java

package com.erc.library; import java.io.BufferedInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import android.app.ActionBar; import android.app.ActionBar.Tab; import android.app.FragmentTransaction; import android.content.SharedPreferences; import android.content.res.Resources; import android.graphics.Color; import android.os.Bundle; import android.os.Environment; import android.os.StrictMode; import android.support.v4.app.FragmentActivity; import android.support.v4.view.ViewPager; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.widget.TextView; import android.widget.Toast; import com.erc.sayeghlibrary.adapter.TabsPagerAdapter; public class MainActivity extends FragmentActivity implements ActionBar.TabListener { private ViewPager viewPager; private TabsPagerAdapter mAdapter; private ActionBar actionBar; // Tab titles private String[] tabs = { "Stories", "Dictionaries", "eBooks"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); int actionBarTitleId = Resources.getSystem().getIdentifier("action_bar_title", "id", "android"); if (actionBarTitleId > 0) { TextView title = (TextView) findViewById(actionBarTitleId); if (title != null) { title.setTextColor(Color.WHITE); } } // Initilization viewPager = (ViewPager) findViewById(R.id.pager); actionBar = getActionBar(); mAdapter = new TabsPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(mAdapter); 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)); } /** * on swiping the viewpager make respective tab selected * */ 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, FragmentTransaction ft) { } @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { // on tab selected // show respected fragment view viewPager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) { } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { // action with ID action_refresh was selected case R.id.Favorites: Toast.makeText(this, "Favorites selected", Toast.LENGTH_SHORT) .show(); break; // action with ID action_settings was selected default: break; } return true; } } 

TabsPagerAdapter.java

 package com.erc.library.adapter; import com.erc.library.Dictionaries; import com.erc.library.Ebooks; import com.erc.library.Stories; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; public class TabsPagerAdapter extends FragmentPagerAdapter { public TabsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int index) { switch (index) { case 0: return new Stories(); case 1: return new Dictionaries(); case 2: // Movies fragment activity return new Ebooks(); } return null; } @Override public int getCount() { // get item count - equal to number of tabs return 3; } } 

我正在制作一个库应用程序,其中导航是通过制表符,问题是每次我从第三个标签页走到第一个或第一个到第三个,标签内容刷新,我想防止刷新,任何请帮助 ?

默认情况下,当您滑动页面时, ViewPager重新创build片段。 为了防止这种情况,你可以尝试以下两件事之一:

1.在片段的onCreate()中,调用setRetainInstance(true)

2.如果片段数量固定且相对较小,则在onCreate()添加以下代码:

 mViewPager = (ViewPager)findViewById(R.id.pager); mViewPager.setOffscreenPageLimit(limit); /* limit is a fixed integer*/ 

如果我没有记错,第二个select是更有希望的。 但是我强烈build议您尝试一下,看看他们中的哪一个人工作。

一个必须先实例化FragmentPagerAdapter ,然后.getCount()将返回一个值 –

.getCount() - 1应设置为默认的屏幕外限制:

 TabsPagerAdapter adapter = new TabsPagerAdapter(getSupportFragmentManager()); /* the ViewPager requires a minimum of 1 as OffscreenPageLimit */ int limit = (adapter.getCount() > 1 ? adapter.getCount() - 1 : 1); ViewPager viewPager = (ViewPager) findViewById(R.id.pager); viewPager.setAdapter(adapter); viewPager.setOffscreenPageLimit(limit); 

您可以通过检查视图是否为空来处理视图娱乐

 public class FragmentExample extends Fragment { private View rootView; public FragmentExample() {} @Override public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { if (rootView == null) { rootView = inflater.inflate(R.layout.fragment_example_layout, container, false); // Initialise your layout here } else { ((ViewGroup) rootView.getParent()).removeView(rootView); } return rootView; } } 

在你的片段的onCreate()中,调用setRetainInstance(true)

由于活动实现了ActionBar.TabListener,所以活动的onCreate()被一次又一次地调用。 所以把下面的代码放在onResume()方法中:

  // Initilization viewPager = (ViewPager) findViewById(R.id.pager); actionBar = getActionBar(); mAdapter = new TabsPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(mAdapter); 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)); } /** * on swiping the viewpager make respective tab selected * */ 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) { } }); 

这个问题有点晚了,但是感谢YS,知道ViewPager是如何工作的。 我正在构build一个包含4个选项卡的应用程序,并且在任何时候都注意到只有两个选项卡正在刷新,我认为这是一个默认行为。 经过几个小时的调查,我明白了Android刷新多个选项卡,为用户带来平滑的滑动性能 – 您可能会注意到,您将点击tab2,但android为tab3带来了数据,并保持准备就绪。

虽然这种行为是好的,但是有利有弊。 优点 – 当你login到该选项卡时,可以获得顺畅的刷卡体验,而无需从外部服务器加载数据。 缺点 – 你在标签中的后台实现可能会折腾。 当你点击一个选项卡时,如果你的方法是在左上angular设置backarrow(home),那么view pager实际上会调用更平滑的选项卡,根据点击的选项卡中的backstack中的内容,最终会遇到麻烦。

setOffscreenPageLimit是这个答案。 如果您希望自定义的backstack框架正常工作,并且不想在单击tab2时调用tab3,则只需将该值设置为选项卡的数量即可。 例如,如果您有4个选项卡,请设置setOffScreePageLimit(4)。 这意味着Android会最初刷新所有4个片段,这是一个性能开销(应该正确pipe理)。 但是,你的后台和标签切换保持不变。 希望这可以帮助。