转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37970961
自从Fragment出现,曾经有段时间,感觉大家谈什么都能跟Fragment谈上关系,做什么都要问下Fragment能实现不~~~哈哈,是不是有点过~~~
本篇博客力求为大家说明Fragment如何产生,什么是Fragment,Fragment生命周期,如何静态和动态的使用Fragment,Fragment回退栈,Fragment事务;以及Fragment的一些特殊用途,例如:没有布局的Fragment有何用处?Fragment如何与Activity交互?Fragment如何创建对话框?Fragment如何与ActionBar集成等等。
1、Fragment的产生与介绍
Android运行在各种各样的设备中,有小屏幕的手机,超大屏的平板甚至电视。针对屏幕尺寸的差距,很多情况下,都是先针对手机开发一套App,然后拷贝一份,修改布局以适应平板神马超级大屏的。难道无法做到一个App可以同时适应手机和平板么,当然了,必须有啊。Fragment的出现就是为了解决这样的问题。你可以把Fragment当成Activity的一个界面的一个组成部分,甚至Activity的界面可以完全有不同的Fragment组成,更帅气的是Fragment拥有自己的生命周期和接收、处理用户的事件,这样就不必在Activity写一堆控件的事件处理的代码了。更为重要的是,你可以动态的添加、替换和移除某个Fragment。
贴出代码
先贴出两个Fragment文件的代码
ShouYe.java
1 package com.wuxianedu.mimixun; 2 3 import android.support.v4.app.Fragment; 4 import android.support.annotation.Nullable; 5 import android.os.Bundle; 6 import android.view.LayoutInflater; 7 import android.view.View; 8 import android.view.ViewGroup; 9 //继承Fragment类 10 public class ShouYe extends Fragment { 11 /** 12 * 继承Fragment类需要重写两个方法 13 * 第一个onCreateView方法---返回布局 14 * 第二个onViewCreated---绑定控件 15 * @param inflater 16 * @param container 17 * @param savedInstanceState 18 * @return 19 */ 20 @Nullable 21 @Override 22 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 23 View view = inflater.inflate(R.layout.activity_shou_ye, null); 24 return view; 25 } 26 27 @Override 28 public void onViewCreated(View view, Bundle savedInstanceState) { 29 super.onViewCreated(view, savedInstanceState); 30 } 31 }
Gm.java
1 package com.wuxianedu.mimixun; 2 3 import android.support.v4.app.Fragment; 4 import android.support.annotation.Nullable; 5 import android.os.Bundle; 6 import android.view.LayoutInflater; 7 import android.view.View; 8 import android.view.ViewGroup; 9 10 public class Gm extends Fragment { 11 12 @Nullable 13 @Override 14 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 15 View view = inflater.inflate(R.layout.activity_gm, null); 16 return view; 17 } 18 @Override 19 public void onViewCreated(View view, Bundle savedInstanceState) { 20 super.onViewCreated(view, savedInstanceState); 21 } 22 }
MainActivity.java
1 package com.wuxianedu.mimixun; 2 3 import android.support.v4.app.Fragment; 4 import android.support.v4.app.FragmentManager; 5 import android.support.v4.app.FragmentPagerAdapter; 6 import android.support.v4.view.ViewPager; 7 import android.support.v7.app.AppCompatActivity; 8 import android.os.Bundle; 9 import android.view.View; 10 import android.widget.RadioButton; 11 12 public class BaseActivity extends AppCompatActivity implements View.OnClickListener { 13 //new一个fragment数组,有几个就new几个 14 private Fragment[] fragment = new Fragment[2]; 15 //new一个RadioButton数组, 16 private RadioButton [] radioButtons =new RadioButton[2]; 17 //滑动组件 18 private ViewPager viewpager; 19 @Override 20 protected void onCreate(Bundle savedInstanceState) { 21 super.onCreate(savedInstanceState); 22 setContentView(R.layout.activity_base); 23 Initialize(); 24 } 25 private void Initialize(){ 26 /** 27 * 让fragment[0]的页面为new ShouYe(); 28 * 让fragment[1]的页面为 new Gm(); 29 */ 30 fragment[0] = new ShouYe(); 31 fragment[1] = new Gm(); 32 //初始化viewpager 33 viewpager = (ViewPager) findViewById(R.id.fl_id); 34 // Fragment填充数据 35 MyPagerAdapter myPagerAdapter = new MyPagerAdapter(getSupportFragmentManager()); 36 //Fragment填充数据 37 viewpager.setAdapter(myPagerAdapter); 38 radioButtons[0] = (RadioButton) findViewById(R.id.rb_weixin); 39 radioButtons[1] = (RadioButton) findViewById(R.id.rb_tongxunlu); 40 41 radioButtons[0].setOnClickListener(this); 42 radioButtons[1].setOnClickListener(this); 43 //viewpager的滑动事件 44 viewpager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 45 @Override 46 public void onPageSelected(int arg0) { 47 radioButtons[arg0].setChecked(true); 48 } 49 @Override 50 public void onPageScrolled(int arg0, float arg1, int arg2) { 51 } 52 @Override 53 public void onPageScrollStateChanged(int arg0) { 54 } 55 }); 56 } 57 58 @Override 59 public void onClick(View v) { 60 switch (v.getId()) { 61 case R.id.rb_weixin://微信 62 //跳转第一个界面 63 viewpager.setCurrentItem(0,false); 64 break; 65 case R.id.rb_tongxunlu://通讯录 66 //跳转第二个界面 67 viewpager.setCurrentItem(1,false); 68 69 break; 70 default: 71 break; 72 } 73 } 74 75 /** 76 * Fragment填充数据 77 */ 78 class MyPagerAdapter extends FragmentPagerAdapter { 79 80 public MyPagerAdapter(FragmentManager fm) { 81 super(fm); 82 // TODO Auto-generated constructor stub 83 } 84 85 @Override 86 public android.support.v4.app.Fragment getItem(int arg0) { 87 // TODO Auto-generated method stub 88 return fragment[arg0]; 89 } 90 91 @Override 92 public int getCount() { 93 // TODO Auto-generated method stub 94 return fragment.length; 95 } 96 97 } 98 99 }
这里要说到一下,使用Fragment要new一个内部类,如下
75 /** 76 * Fragment填充数据 77 */ 78 class MyPagerAdapter extends FragmentPagerAdapter { 79 80 public MyPagerAdapter(FragmentManager fm) { 81 super(fm); 82 // TODO Auto-generated constructor stub 83 } 84 85 @Override 86 public android.support.v4.app.Fragment getItem(int arg0) { 87 // TODO Auto-generated method stub 88 return fragment[arg0]; 89 } 90 91 @Override 92 public int getCount() { 93 // TODO Auto-generated method stub 94 return fragment.length; 95 } 96 97 } 98 99 }
好了,代码都贴出来了,代码里面已经写了注释,大家看一下就可以看懂