大鹏一日同风起,扶摇直上九万里。这篇文章主要讲述Android实际开发中的首页框架搭建(首页框架实现)相关的知识,希望能为你提供帮助。
首页框架搭建以及Fragment的切换,其中包含有实际开发中的一些命名规范,以及项目结构本来这一篇是前两天就要写的,奈何事多缠身,推到今日,为自己的拖延感到愧疚。。。
上一篇大概把项目的结构完成了,下一步就是实现首页切换功能了
首先在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*/ 34private FragmentManager fm; 35private HomeFragment mHomeFragment; 36private MessageFragment mMessageFragment; 37private MineFragment mMineFragment; 38private Fragment mCurrent; 39 40 41private RelativeLayout mHomeLayout; 42private RelativeLayout mMessageLayout; 43private RelativeLayout mMineLayout; 44private TextView mHomeView; 45private TextView mMessageView; 46private TextView mMineView; 47 48@Override 49protected void onCreate(Bundle savedInstanceState) { 50super.onCreate(savedInstanceState); 51setContentView(R.layout.activity_home_layout); 52//初始化这个界面的控件 53initView(); 54 55mHomeFragment = new HomeFragment(); 56fm = getFragmentManager(); 57FragmentTransaction fragmentTransaction = fm.beginTransaction(); 58fragmentTransaction.replace(R.id.content_layout,mHomeFragment); 59fragmentTransaction.commit(); 60} 61 62private void initView() { 63mHomeLayout = (RelativeLayout) findViewById(R.id.home_layout_view); 64mHomeLayout.setOnClickListener(this); 65mMessageLayout = (RelativeLayout) findViewById(R.id.message_layout_view); 66mMessageLayout.setOnClickListener(this); 67mMineLayout = (RelativeLayout) findViewById(R.id.mine_layout_view); 68mMineLayout.setOnClickListener(this); 69 70mHomeView = (TextView) findViewById(R.id.home_image_view); 71mMessageView = (TextView) findViewById(R.id.message_image_view); 72mMineView = (TextView) findViewById(R.id.mine_image_view); 73mHomeView.setBackgroundResource(R.mipmap.comui_tab_home_selected); 74} 75 76/** 77* 隐藏Fragment方法 78* @param fragment 79* @param ft 80*/ 81private void hideFragment(Fragment fragment, FragmentTransaction ft) { 82if (fragment != null) { 83ft.hide(fragment); 84} 85} 86 87@Override 88public void onClick(View v) { 89FragmentTransaction fragmentTransaction = fm.beginTransaction(); 90switch (v.getId()) { 91case R.id.home_layout_view: 92mHomeView.setBackgroundResource(R.mipmap.comui_tab_home_selected); 93mMessageView.setBackgroundResource(R.mipmap.comui_tab_message); 94mMineView.setBackgroundResource(R.mipmap.comui_tab_person); 95 96//隐藏其他的Fragment 97hideFragment(mMessageFragment, fragmentTransaction); 98hideFragment(mMineFragment, fragmentTransaction); 99//将我们的HomeFragment显示出来 100if (mHomeFragment == null) { 101mHomeFragment = new HomeFragment(); 102fragmentTransaction.add(R.id.content_layout, mHomeFragment); 103} else { 104mCurrent = mHomeFragment; 105fragmentTransaction.show(mHomeFragment); 106} 107break; 108case R.id.message_layout_view: 109mMessageView.setBackgroundResource(R.mipmap.comui_tab_message_selected); 110mHomeView.setBackgroundResource(R.mipmap.comui_tab_home); 111mMineView.setBackgroundResource(R.mipmap.comui_tab_person); 112 113hideFragment(mHomeFragment, fragmentTransaction); 114hideFragment(mMineFragment, fragmentTransaction); 115if (mMessageFragment == null) { 116mMessageFragment = new MessageFragment(); 117fragmentTransaction.add(R.id.content_layout, mMessageFragment); 118} else { 119mCurrent = mMessageFragment; 120fragmentTransaction.show(mMessageFragment); 121} 122break; 123case R.id.mine_layout_view: 124mMineView.setBackgroundResource(R.mipmap.comui_tab_person_selected); 125mHomeView.setBackgroundResource(R.mipmap.comui_tab_home); 126mMessageView.setBackgroundResource(R.mipmap.comui_tab_message); 127hideFragment(mMessageFragment, fragmentTransaction); 128hideFragment(mHomeFragment, fragmentTransaction); 129if (mMineFragment == null) { 130mMineFragment = new MineFragment(); 131fragmentTransaction.add(R.id.content_layout, mMineFragment); 132} else { 133mCurrent = mMineFragment; 134fragmentTransaction.show(mMineFragment); 135} 136break; 137} 138 139fragmentTransaction.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 29private View mContentView; 30 31public HomeFragment() { 32 33} 34 35@Override 36public void onCreate(Bundle savedInstanceState) { 37super.onCreate(savedInstanceState); 38} 39 40@Override 41public View onCreateView(LayoutInflater inflater, ViewGroup container, 42Bundle savedInstanceState) { 43// Inflate the layout for this fragment 44mContext = getActivity(); 45mContentView = inflater.inflate(R.layout.fragment_home_layout, container, false); 46return 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
【Android实际开发中的首页框架搭建(首页框架实现)】
推荐阅读
- Android广播基础
- Android 6.0权限申请
- Android增加(键盘)按键
- Android帧动画实现,防OOM,比原生动画集节约超过十倍的资源
- GRE数据分析|数据分布,随机变量和概率分布
- Java程序打印字符串的不同排列
- Oracle面试经验|S62(校园服务器技术)
- Java使用正则表达式验证日期格式
- 按字典顺序,给定字符串的所有最短回文子字符串