中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-09-20 08:35:15 來源:腳本之家 閱讀:206 作者:小豪丶 欄目:移動開發

前言

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的,思想是一樣的,但這樣實現起來很是丑陋,所以不建議使用。

總結

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

年辖:市辖区| 信阳市| 阜康市| 玛多县| 增城市| 阿城市| 通道| 沙洋县| 灯塔市| 宁强县| 建宁县| 壶关县| 宝兴县| 新巴尔虎左旗| 林周县| 东辽县| 宁陵县| 西安市| 五原县| 明水县| 厦门市| 来安县| 婺源县| 永吉县| 宁夏| 太原市| 靖宇县| 苗栗市| 罗甸县| 祁门县| 两当县| 梅州市| 项城市| 丰宁| 桃源县| 逊克县| 贵港市| 二连浩特市| 磴口县| 郯城县| 天全县|