Android實際開發中的首頁框架搭建(二、首頁框架實現)


本來這一篇是前兩天就要寫的,奈何事多纏身,推到今日,為自己的拖延感到愧疚。。。

上一篇大概把項目的結構完成了,下一步就是實現首頁切換功能了

首先在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 }
View Code

然后在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 }
View Code

 

對於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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM