本來這一篇是前兩天就要寫的,奈何事多纏身,推到今日,為自己的拖延感到愧疚。。。
上一篇大概把項目的結構完成了,下一步就是實現首頁切換功能了
首先在activity目錄下新建一個HomeActivity,作為承載多個fragment的容器
代碼如下

1 /* 2 * * 3 * * ******************************************************* 4 * * 5 * * @文件名稱:HomeActivity.java 6 * * @文件作者:ouyangshengduo Copyright(c) 2017. All rights reserved. 7 * * @創建時間:17-3-21 下午10:08 8 * * @文件描述: 9 * * @修改歷史:Last modified 17-3-21 下午9:58 ******************************************************** 10 * 11 */ 12 13 package oysd.com.framebulding.activity; 14 15 import android.app.Fragment; 16 import android.app.FragmentManager; 17 import android.app.FragmentTransaction; 18 import android.os.Bundle; 19 import android.support.v7.app.AppCompatActivity; 20 import android.view.View; 21 import android.widget.RelativeLayout; 22 import android.widget.TextView; 23 24 import oysd.com.framebulding.R; 25 import oysd.com.framebulding.view.fragment.home.HomeFragment; 26 import oysd.com.framebulding.view.fragment.home.MessageFragment; 27 import oysd.com.framebulding.view.fragment.home.MineFragment; 28 29 public class HomeActivity extends AppCompatActivity implements View.OnClickListener { 30 31 /** 32 * fragment相關 33 */ 34 private FragmentManager fm; 35 private HomeFragment mHomeFragment; 36 private MessageFragment mMessageFragment; 37 private MineFragment mMineFragment; 38 private Fragment mCurrent; 39 40 41 private RelativeLayout mHomeLayout; 42 private RelativeLayout mMessageLayout; 43 private RelativeLayout mMineLayout; 44 private TextView mHomeView; 45 private TextView mMessageView; 46 private TextView mMineView; 47 48 @Override 49 protected void onCreate(Bundle savedInstanceState) { 50 super.onCreate(savedInstanceState); 51 setContentView(R.layout.activity_home_layout); 52 //初始化這個界面的控件 53 initView(); 54 55 mHomeFragment = new HomeFragment(); 56 fm = getFragmentManager(); 57 FragmentTransaction fragmentTransaction = fm.beginTransaction(); 58 fragmentTransaction.replace(R.id.content_layout,mHomeFragment); 59 fragmentTransaction.commit(); 60 } 61 62 private void initView() { 63 mHomeLayout = (RelativeLayout) findViewById(R.id.home_layout_view); 64 mHomeLayout.setOnClickListener(this); 65 mMessageLayout = (RelativeLayout) findViewById(R.id.message_layout_view); 66 mMessageLayout.setOnClickListener(this); 67 mMineLayout = (RelativeLayout) findViewById(R.id.mine_layout_view); 68 mMineLayout.setOnClickListener(this); 69 70 mHomeView = (TextView) findViewById(R.id.home_image_view); 71 mMessageView = (TextView) findViewById(R.id.message_image_view); 72 mMineView = (TextView) findViewById(R.id.mine_image_view); 73 mHomeView.setBackgroundResource(R.mipmap.comui_tab_home_selected); 74 } 75 76 /** 77 * 隱藏Fragment方法 78 * @param fragment 79 * @param ft 80 */ 81 private void hideFragment(Fragment fragment, FragmentTransaction ft) { 82 if (fragment != null) { 83 ft.hide(fragment); 84 } 85 } 86 87 @Override 88 public void onClick(View v) { 89 FragmentTransaction fragmentTransaction = fm.beginTransaction(); 90 switch (v.getId()) { 91 case R.id.home_layout_view: 92 mHomeView.setBackgroundResource(R.mipmap.comui_tab_home_selected); 93 mMessageView.setBackgroundResource(R.mipmap.comui_tab_message); 94 mMineView.setBackgroundResource(R.mipmap.comui_tab_person); 95 96 //隱藏其他的Fragment 97 hideFragment(mMessageFragment, fragmentTransaction); 98 hideFragment(mMineFragment, fragmentTransaction); 99 //將我們的HomeFragment顯示出來 100 if (mHomeFragment == null) { 101 mHomeFragment = new HomeFragment(); 102 fragmentTransaction.add(R.id.content_layout, mHomeFragment); 103 } else { 104 mCurrent = mHomeFragment; 105 fragmentTransaction.show(mHomeFragment); 106 } 107 break; 108 case R.id.message_layout_view: 109 mMessageView.setBackgroundResource(R.mipmap.comui_tab_message_selected); 110 mHomeView.setBackgroundResource(R.mipmap.comui_tab_home); 111 mMineView.setBackgroundResource(R.mipmap.comui_tab_person); 112 113 hideFragment(mHomeFragment, fragmentTransaction); 114 hideFragment(mMineFragment, fragmentTransaction); 115 if (mMessageFragment == null) { 116 mMessageFragment = new MessageFragment(); 117 fragmentTransaction.add(R.id.content_layout, mMessageFragment); 118 } else { 119 mCurrent = mMessageFragment; 120 fragmentTransaction.show(mMessageFragment); 121 } 122 break; 123 case R.id.mine_layout_view: 124 mMineView.setBackgroundResource(R.mipmap.comui_tab_person_selected); 125 mHomeView.setBackgroundResource(R.mipmap.comui_tab_home); 126 mMessageView.setBackgroundResource(R.mipmap.comui_tab_message); 127 hideFragment(mMessageFragment, fragmentTransaction); 128 hideFragment(mHomeFragment, fragmentTransaction); 129 if (mMineFragment == null) { 130 mMineFragment = new MineFragment(); 131 fragmentTransaction.add(R.id.content_layout, mMineFragment); 132 } else { 133 mCurrent = mMineFragment; 134 fragmentTransaction.show(mMineFragment); 135 } 136 break; 137 } 138 139 fragmentTransaction.commit(); 140 } 141 }
然后在Fragment的目錄下,新建自己的Fragment,我這里分三個,HomeFragment,MessageFragment,MineFragment
代碼如下,這里只貼了HomeFragment,因為都是空的,所以其他的Fragment除了布局文件不一樣,都差不多,沒有實現什么功能,后期會慢慢往里面添加功能

1 /* 2 * * 3 * * ******************************************************* 4 * * 5 * * @文件名稱:HomeFragment.java 6 * * @文件作者:ouyangshengduo Copyright(c) 2017. All rights reserved. 7 * * @創建時間:17-3-21 下午10:11 8 * * @文件描述: 9 * * @修改歷史:Last modified 17-3-21 下午10:11 ******************************************************** 10 * 11 */ 12 13 package oysd.com.framebulding.view.fragment.home; 14 15 import android.os.Bundle; 16 import android.view.LayoutInflater; 17 import android.view.View; 18 import android.view.ViewGroup; 19 20 import oysd.com.framebulding.R; 21 import oysd.com.framebulding.view.fragment.BaseFragment; 22 23 /** 24 * HomeFragment 25 */ 26 public class HomeFragment extends BaseFragment { 27 28 29 private View mContentView; 30 31 public HomeFragment() { 32 33 } 34 35 @Override 36 public void onCreate(Bundle savedInstanceState) { 37 super.onCreate(savedInstanceState); 38 } 39 40 @Override 41 public View onCreateView(LayoutInflater inflater, ViewGroup container, 42 Bundle savedInstanceState) { 43 // Inflate the layout for this fragment 44 mContext = getActivity(); 45 mContentView = inflater.inflate(R.layout.fragment_home_layout, container, false); 46 return mContentView; 47 } 48 }
對於HomeActivity中的Fragment的切換,這里要講一下一個知識點,Fragment的切換以及切換方式,
我們來大概瀏覽一下Android里面的Fragment的源碼,就能知道它的切換方式了,截圖如下:
所以Fragment的切換方式真正意義上我覺得分三種,(add,remove),(hide,show),(detach,attach),replace是先remove再add的,所以和第一種是一樣的,
他們之間的區別(個人總結,不對請噴):
第一種(add,remove,replace):每次都會新建Fragment實例
第二種(hide,show):比較消耗內存的方式,但是是我們實際開發中用的最多的,因為它不會每次都新建Fragment實例,有新的Fragment的時候,加到FragmentManager里面去就行
第三種(detach,attach):Fragment實例沒有被銷毀還是占內存,但每一次View都會被銷毀,之后我們需要每一次都需重新要繪制View,所以實際開發中很少用,特別麻煩,而且也沒有優化多少內存
以上,是對於一個項目的首頁框架的搭建以及Fragment之間的切換,比較基礎,其中的知識點如下:
知識點一:使用BaseFragment/BaseActivity的作用:抽象到父類的思維模式
知識點二:Fragment的切換以及切換的方式
知識點三:項目結構以及命名規范
源碼地址:https://github.com/ouyangshengduo/FrameBulding