国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android中Fragment相互切換間不被回收的實現方法

2019-10-22 18:31:10
字體:
來源:轉載
供稿:網友

前言

Android運行在各種各樣的設備中,有小屏幕的手機,超大屏的平板甚至電視。針對屏幕尺寸的差距,很多情況下,都是先針對手機開發一套App,然后拷貝一份,修改布局以適應平板神馬超級大屏的。難道無法做到一個App可以同時適應手機和平板么,當然了,必須有啊。Fragment的出現就是為了解決這樣的問題。

如今市面上的應用基本上都是單Activity+多Fragment實現的了,而這類APP都有在相互切換時不被回收,即切換回原來的Fragment時還是原先的狀態,這就是這里要實現的了。

這里使用Fragment的add()show()hide()實現,即顯示和隱藏,這樣原來的Fragment就不會被銷毀了。

二話不說,貼代碼,代碼是最好的老師。

示例代碼(注釋還算詳細了)

public class MainActivity extends AppCompatActivity implements View.OnClickListener { private ImageView ibOne; private ImageView ibTwo; private ImageView ibThree;  private FragmentManager mFm; private ArrayList<Fragment> mFragmentList = new ArrayList<Fragment>(); private String[] mFragmentTagList = {"OneFragment", "TwoFragment", "ThreeFragment"}; private Fragment mCurrentFragmen = null; // 記錄當前顯示的Fragment @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);    initView();  initData();   } private void initData() {  OneFragment oneFragment = new OneFragment();  TwoFragment twoFragment = new TwoFragment();  ThreeFragment threeFragment = new ThreeFragment();  mFragmentList.add(0, oneFragment);  mFragmentList.add(1, twoFragment);  mFragmentList.add(2, threeFragment);  mCurrentFragmen = mFragmentList.get(0);  // 初始化首次進入時的Fragment  mFm = getFragmentManager();  FragmentTransaction transaction = mFm.beginTransaction();  transaction.add(R.id.fl_show, mCurrentFragmen, mFragmentTagList[0]);  transaction.commitAllowingStateLoss(); } // findViewById private void initView() {  ibOne = (ImageView)findViewById(R.id.ib_one);  ibTwo = (ImageView)findViewById(R.id.ib_two);  ibThree = (ImageView)findViewById(R.id.ib_three);  ibOne.setOnClickListener(this);  ibTwo.setOnClickListener(this);  ibThree.setOnClickListener(this); } @Override public void onClick(View view) {  switch (view.getId()){   case R.id.ib_one:    switchFragment(mFragmentList.get(0), mFragmentTagList[0]);    break;   case R.id.ib_two:    switchFragment(mFragmentList.get(1), mFragmentTagList[1]);    break;   case R.id.ib_three:    switchFragment(mFragmentList.get(2), mFragmentTagList[2]);    break;  } } // 轉換Fragment void switchFragment(Fragment to, String tag){  if(mCurrentFragmen != to){   FragmentTransaction transaction = mFm.beginTransaction();   if(!to.isAdded()){    // 沒有添加過:    // 隱藏當前的,添加新的,顯示新的    transaction.hide(mCurrentFragmen).add(R.id.fl_show, to, tag).show(to);   }else{    // 隱藏當前的,顯示新的    transaction.hide(mCurrentFragmen).show(to);   }   mCurrentFragmen = to;   transaction.commitAllowingStateLoss();  } } // 當activity非正常銷毀時被調用 @Override public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {  super.onSaveInstanceState(outState, outPersistentState);  // 重置Fragment,防止當內存不足時導致Fragment重疊  updateFragment(outState); } // 重置Fragment private void updateFragment(Bundle outState) {  mFm = getFragmentManager();  if(outState == null){   FragmentTransaction transaction = mFm.beginTransaction();   OneFragment oneFragment = new OneFragment();   mCurrentFragmen = oneFragment;   transaction.add(R.id.fl_show, oneFragment, mFragmentTagList[0]).commitAllowingStateLoss();  }else{   // 通過tag找到fragment并重置   OneFragment oneFragment = (OneFragment) mFm.findFragmentByTag(mFragmentTagList[0]);   TwoFragment twoFragment = (TwoFragment) mFm.findFragmentByTag(mFragmentTagList[1]);   ThreeFragment threeFragment = (ThreeFragment) mFm.findFragmentByTag(mFragmentTagList[2]);   mFm.beginTransaction().show(oneFragment).hide(twoFragment).hide(threeFragment);  } }}

我以前對于這種需求是在一個Activity中使用RelativeLayout,在其中加入多個布局(類似Fragment),當點擊下方Tab時設置布局的visibility的,思想是一樣的,但這樣實現起來很是丑陋,所以不建議使用。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阿拉善左旗| 宝坻区| 宝丰县| 凉城县| 长寿区| 新宁县| 房产| 定陶县| 绿春县| 金门县| 乌鲁木齐市| 辽源市| 宁陕县| 新郑市| 姚安县| 大丰市| 安龙县| 陈巴尔虎旗| 盱眙县| 庆安县| 海口市| 新和县| 同心县| 石家庄市| 武冈市| 荆州市| 新平| 武威市| 亚东县| 田阳县| SHOW| 金坛市| 荃湾区| 中西区| 台安县| 拉萨市| 东海县| 万全县| 平凉市| 天门市| 盱眙县|