一、Fragment
Fragment意为碎片,是为了适应与解决基于Android系统设备越来越多以及各种各种设备使用分辨率种类也越来越多问题,而由Google提出的,在Android系统3.0之后引入Fragment(碎片)功能。
一个Activity页面中可以包含多个Fragment模块,而同一个Fragment模块也可以被多个Activity使用。每个Fragment有自己的布局,有自己的生命周期。虽然Fragment拥有自己的生命周期,但因为Fragment必须被嵌入到Activity中使用,因此Fragment的生命周期是受其Activity宿主的生命周期所控制的。当Activity暂停时,该Activtiy内的所有Fragment都会暂停;当Activity被销毁时,该Activity内的所有Fragment都会被销毁。
二、Fragment的优点
1、使用Fragment可以在一个Activity中实现不同界面的灵活切换,帮助程序员解决局部布局问题
2、Fragment解决了Activity间的切换不流畅,布局切换时更轻量
3、Fragment可以封装成不同的重用组件,并可以单独管理其生命周期和UI布局
4、Fragment无需再AndroidManifest中注册,可以在布局文件中直接引用
三、Fragment的使用
Fragment在使用时有静态加载和动态加载两种加载方法
1、静态加载
首先要新建一个类继承Fragment,使用LayoutInflater对象中 inflater方法绑定布局和控件。
public class AFragment extends Fragment {
public AFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
//引用创建好的xml布局
View view=inflater.inflate(R.layout.fragment_a, container, false);
return view;//return要返回view所传的值
}
}
要实现Fragment中的内容在Activity中实现就需要在Activity的行布局xml中写入fragment的方法实现如下图说是效果:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.lenovo.liu.fragmentapplition.MainActivity"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="100dp"
android:text="这是一个TextView"
android:gravity="center"/>//让文字居中
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
//利用orientation中horizontal方法使两个Fragment水平排列
android:orientation="horizontal">
<fragment
android:id="@+id/main_fragmenta"
//使用权重的方法使两个Fragment平均分布
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:layout_gravity="center"
android:name="com.lenovo.liu.fragmentapplition.AFragment"
/>
<fragment
android:id="@+id/main_fragmentb"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
//导入到是所需要切换的界面
android:name="com.lenovo.liu.fragmentapplition.fragment.BFragment"
/>
//在利用fragment方法时,id和name方法是必不可少的,少一项程序都不能运行
</LinearLayout>
</LinearLayout>
2、动态加载
在使用Fragment动态加载中有三种方法的使用非常关键,那就是FragmentManager、FragmentTransaction与commit这三种方法。
FragmentManager:管理Activity中的Fragments,需要使用FragmentManager,调用Activity中的getFragmentManager()方法获得。
FragmentTransaction:Fragment事务对象,对Fragment进行添加、移除、替换、提交等操作的对象。
commit:
1、当所有准备工作完成后,必须调用commit方法才能执行和生效
2、相当于Toast中的show方法,不调用此方法,不会执行
代码如下:
在xml行布局中的代码
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/nv_btn"
android:layout_width="80dp"
android:layout_height="60dp"
android:text="女装" />
<Button
android:id="@+id/man_btn"
android:layout_width="80dp"
android:layout_height="60dp"
android:text="男装" />
</LinearLayout>
<FrameLayout
android:id="@+id/fragment_content"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
Activity中的代码
public class Main2Activity extends AppCompatActivity implements View.OnClickListener {
//定义按钮和所需要切换的界面
private Button nvbtn;
private Button manbtn;
private Fragment nvfragment;
private Fragment manfragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
bindID();//绑定id
}
private void bindID() {
nvbtn = findViewById(R.id.nv_btn);
manbtn = findViewById(R.id.man_btn);
//绑定监听事件
nvbtn.setOnClickListener(this);
manbtn.setOnClickListener(this);
}
@Override
public void onClick(View view) {
FragmentManager manager=getFragmentManager();//创建FragmentManager对象
FragmentTransaction transaction=manager.beginTransaction();//创建FragmentTransaction对象
//运用switch语句判断点击的是哪一个按钮
switch (view.getId()) {
case R.id.nv_btn:
if(nvfragment==null){
nvfragment=new NvFragment();
}
//使用另一个Fragment替换当前的Fragment
transaction.replace(R.id.fragment_content,nvfragment);
break;
case R.id.man_btn:
if(manfragment==null){
manfragment=new ManFragment();
}
transaction.replace(R.id.fragment_content,manfragment);
break;
default:
break;
}
transaction.commit();//最后提交事务
}
}
四、Fragment与ViewPager的共同使用
运用ViewPager来调用Fragment的界面切换就需要用到适配器,适配器更方便了界面的调用
适配器代码
public class PagerAdapter extends FragmentPagerAdapter{
//定义数组
List<Fragment> mfragmentlist;
public PagerAdapter(FragmentManager fm,List<Fragment> fragmentlist) {
super(fm);
this.mfragmentlist=fragmentlist;
}
@Override
public Fragment getItem(int position) {
//返回数组中得到的值
return mfragmentlist.get(position);
}
@Override
public int getCount() {
//返回数组的长度
return mfragmentlist.size();
}
}
xml行布局中的代码
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.lenovo.liu.fragmentapplition.Main3Activity">
<LinearLayout
android:id="@+id/fragment_main3"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:orientation="horizontal">
<Button
android:id="@+id/content_btn"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="联系人" />
<Button
android:id="@+id/friend_btn"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="朋友圈" />
<Button
android:id="@+id/news_btn"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="消息" />
</LinearLayout>
//要用ViewPager属性必须是在v4zhong
<android.support.v4.view.ViewPager
android:id="@+id/view_viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/fragment_main3">
</android.support.v4.view.ViewPager>
</RelativeLayout>
在Activity中的代码
public class Main3Activity extends AppCompatActivity implements OnClickListener {
//定义按钮
private Button conbtn;
private Button friendbtn;
private Button newsbtn;
//定义viewPager
private ViewPager viewPager;
//创建碎片
private ContentFragment contentFragment;
private FriendFragment friendFragment;
private NewFragment newFragment;
//定义数组的初始值
ArrayList<Fragment>fragmentList=new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
//绑定id
bindID();
//定义初始值
contentFragment=new ContentFragment();
friendFragment=new FriendFragment();
newFragment=new NewFragment();
//在数组中添加fragment
fragmentList.add(contentFragment);
fragmentList.add(friendFragment);
fragmentList.add(newFragment);
//创建适配器
PagerAdapter adapter=new com.lenovo.liu.fragmentapplition.adapter.PagerAdapter(getSupportFragmentManager(),fragmentList);
//绑定适配器
viewPager.setAdapter(adapter);
}
private void bindID() {
conbtn = findViewById(R.id.content_btn);
friendbtn = findViewById(R.id.friend_btn);
newsbtn = findViewById(R.id.news_btn);
viewPager=findViewById(R.id.view_viewpager);
//设置监听事件
conbtn.setOnClickListener(this);
friendbtn.setOnClickListener(this);
newsbtn.setOnClickListener(this);
}
//设置点击事件
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.content_btn:
//返回从适配器中得到的传值
viewPager.setCurrentItem(0);
break;
case R.id.friend_btn:
viewPager.setCurrentItem(1);
break;
case R.id.news_btn:
viewPager.setCurrentItem(2);
break;
default:
break;
}
}
}