在Android初级课程中,对fragment的认识仅限于是一个碎片,在高级课程第一课中,便深入认识fragment。下面我简单谈一下学习fragment之后对于fragment的认识。
1、fragment简介
什么是fragment?使用fragment有什么好处?
fragment是一个可以将activity拆分成几个完全独立封装的可重用的组件。基于android系统的设备越来越多,分辨率种类越来越多,Google提出fragment的概念是希望通过fragment设计的布局可以动态、灵活的解决不同屏幕分辨率的适配问题。使用fragment可以在activity中实现不同界面的灵活切换。
2、如何使用fragment?
fragment的静态加载
步骤:
1、创建MainActivity、AFragment和BFragment,由于我的代码是十分简单的静态fragment,所以在MainActivity里没有写语句,只在layout里把布局语句写好了。
代码展示:
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="100dp"
android:text="这是一个界面"
android:textSize="30sp"
android:gravity="center"
/>
<FrameLayout
android:layout_below="@+id/text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#b6b6b6"
>
</FrameLayout>
fragment的动态加载
- 新建类继承fragment
- 重写OnCreateView方法
- 使用LayoutInflater对象中的inflate方法绑定布局和控件
- 在Activity对应的布局文件中通过标签引用
简单举例:在主页左边有两个按钮,按其中一个右边出现相对应要显示的内容。
步骤:
1、首先创建一个MainActivity和两个fragment(AFragment、BFragment),在fragment的布局文件layout里面填充内容,把onCreateView方法重写一下。
代码演示:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view=inflater.inflate(R.layout.fragment_b, container, false);
return view;
}
2、第二步写MainActivity里面layout的布局,创建两个Button按钮和一个fragment标签。
代码演示:
<LinearLayout
android:layout_width="100dp"
android:orientation="vertical"
android:layout_height="match_parent">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="女装"
android:id="@+id/nvbut"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="男装"
android:id="@+id/nanbut"
/>
</LinearLayout>
<FrameLayout
android:id="@+id/shop"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
</FrameLayout>
3、最后一步就是在activity里面写java代码。在这一部分中大部分内容都是在Android基础中学过的,创建对象,绑定id,创建监听事件等,当然也有很重要的新的知识点。比如:
- 管理Activity中的Fragment需要使用FragmentManger,调用Activity中的getFragmentManager()方法获得。
- Fragment事务对象,对Fragment进行添加、移除、替换、提交等操作对象,常用方法有:
- commit方法:当所有的准备工作完成后,必须调用commit方法才能执行和生效。
代码演示:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button nvbut;
private Button nanbut;
private Fragment nanzhuang;
private Fragment nvzhuang;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ID();
}
private void ID() {
nvbut=findViewById(R.id.nvbut);
nanbut=findViewById(R.id.nanbut);
nvbut.setOnClickListener(this);
nanbut.setOnClickListener(this);
}
@Override
public void onClick(View v) {
FragmentManager manager=getFragmentManager();//创建FragmentManger对象
FragmentTransaction transaction=manager.beginTransaction();//创建FragmentTransaction对象
switch (v.getId()){
case R.id.nanbut:
if(nanzhuang==null){
nanzhuang=new BFragment();
}
transaction.replace(R.id.shop,nanzhuang);
break;
case R.id.nvbut:
if(nvzhuang==null)
{
nvzhuang=new AFragment();
transaction.replace(R.id.shop,nvzhuang);
}
break;
default:
break;
}
transaction.commit();//最后一步提交
}
}
效果图:
注意
代码敲到这里一个简单的动态Fragment就写的差不多了,但我要提醒一个很容易报错的地方,在fragment导包的过程中要注意包的统一。fragment的包有两种:
import android.app.Fragment;
import android.support.v4.app.Fragment;
如果布局文件中不含有ViewPager的话,尽量使用上面app的那个包,如果需要使用ViewPager则需要使用下面的那个包,因为ViewPager的包和fragment配套的话只有一种。
3、ViewPager和Fragment配套使用
ViewPager和Fragment一起使用时,可以更好的实现页面的滑动,所以在学习时着重练习这部分。
简单举例:在主页面下方有三个按钮,上面是页卡滑动,既可以实现左右滑动也可以点击按钮实现页面跳转。
步骤:
1、和上面所说的fragment动态加载步骤差不多,不同的是多创建一个适配器暂且命名为MypagerAdapter。主页面的layout中的fragment标签换成ViewPager,以便可以滑动。
layout部分代码演示:
<android.support.v4.view.ViewPager
android:layout_above="@+id/wx_btn"
android:id="@+id/wx_pager"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v4.view.ViewPager>
<LinearLayout
android:id="@+id/wx_btn"
android:layout_alignParentBottom="true"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="消息"
android:textSize="20sp"
android:id="@+id/wx_messagebtn"
/>
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="朋友圈"
android:textSize="20sp"
android:id="@+id/wx_frindsbtn"
/>
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="动态"
android:textSize="20sp"
android:id="@+id/wx_newsbtn"
/>
</LinearLayout>
2、布局文件写好之后就是适配器部分了,让适配器继承一个类FragmentPagerAdapter,定义一个数组,重写它的四个方法,代码如下:
public class MypagerAdapter extends FragmentPagerAdapter {
private List<Fragment> mfragmentList;
public MypagerAdapter(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();
}
}
3、最后一部分就是Activity部分的java代码,实现页面的滑动以及点击按钮切换页面。代码如下:
public class WxActivity extends AppCompatActivity implements View.OnClickListener{
private Button messbtn;
private Button frindsbtn;
private Button newsbtn;
private Fragment messFragment;
private Fragment frindsFragment;
private Fragment newsFragment;
private ViewPager viewPager;
private List<Fragment> fragmentList= new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wx);
ID();
messFragment=new MessageFragment();
frindsFragment=new FrindsFragment();
newsFragment=new NewsFragment();
//添加数据
fragmentList.add(messFragment);
fragmentList.add(frindsFragment);
fragmentList.add(newsFragment);
//创建适配器
MypagerAdapter adapter=new MypagerAdapter(getSupportFragmentManager(),fragmentList);
//绑定适配器
viewPager.setAdapter(adapter);
}
private void ID() {
messbtn=findViewById(R.id.wx_messagebtn);
frindsbtn=findViewById(R.id.wx_frindsbtn);
newsbtn=findViewById(R.id.wx_newsbtn);
viewPager=findViewById(R.id.wx_pager);
messbtn.setOnClickListener(this);
frindsbtn.setOnClickListener(this);
newsbtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.wx_messagebtn:
viewPager.setCurrentItem(0);
break;
case R.id.wx_frindsbtn:
viewPager.setCurrentItem(1);
break;
case R.id.wx_newsbtn:
viewPager.setCurrentItem(2);
break;
default:
break;
}
}
}
效果图:
学习Android到现在,什么多敲代码之类的话就不多说了,现在学习遇到的主要问题是在导入包时是不是前后匹配,不匹配的话是肯定会报错的,而且错误一般很难找,所以下次代码报错找不到错误时,可以看看是否是导包的过程出现事务。