一、Fragment简介

  Android在3.0版本引入了Fragment(碎片)功能,它类似于Activity,也可以 包含布局,而且Fragment通常是嵌套在Activity中使用的。

  场景:有两个Fragment,其中Fragment1包含了一个ListView,每行显示一本 书的标题,而Fragment2包含了TextView和ImageView,显示书的详细内容和图片。

 想想,如果一个很大的界面,就设计成一个布局,写起界面来是不是会有很多麻 烦?如果组件多的话,是不是管理起来也很麻烦!

而使用Fragment,可以把屏幕划分成几块,然后进行分组,进行一个模块化的 管理,从而可以更加方便的在运行过程中动态地更新Activity的用户界面。

  1、Fragment的优势

 注意!!!

        Fragment并不能单独使用,它需要嵌套在Activity中使用,同时当宿主Activity 被destory销毁了,它也会跟着被销毁!

  2、Fragment的基本用法

   步骤1:定制Fragment的XML布局文件

   步骤2:创建一个自定义的Fragment,继承Fragment类,和创建一个Activity很类似, 不同的是需要重写一个onCreateView()方法来返回这个Fragment的布局。

 步骤3:定义Fragment适配器,管理所有的Fragment。

 步骤4:将Fragment添加到activity页面。

二、FragmentPagerAdapter适配器

1、FragmentPagerAdapter派生自PagerAdapter,它是专门用来呈现 Fragment页面的。

2、该类中每一个生成的Fragment都将保存在内存中,所以这个适配器更适合那些数量相对较少,静态的页面。对于存在多个fragment的情况,一般推荐使用FragmentStatePagerAdapter。

3、FragmentPagerAdapter重载了几个必须实现的函数:getItem()、 getCount()。

  1、Activity、FragmentActivity和AppCompatActivity的区别

1、Activity是最基础的页面类,对应getFragmentManager方法来控制Activity和 Fragment之间的交互。

2、FragmentActivity间接继承自Activity,并提供了对v4包中support Fragment的支 持。在FragmentActivity中必须使用getSupportFragmentManager方法来处理 support Fragment的交互。

3、AppCompatActivity继承自FragmentActivity,为Material Design风格控件提供 了便利。

三、程序代码

  1、布局文件代码

    activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<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=".MainActivity">
    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </android.support.v4.view.ViewPager>
</LinearLayout>

    layout1.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:src="@drawable/view1"/>
</RelativeLayout>

    layout2.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:src="@drawable/view2"/>
</RelativeLayout>

    layout3.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:src="@drawable/view3"/>
</RelativeLayout>

  2、功能代码

    FragAdapter.java

package com.example.fragmenttest;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import java.util.List;
public class FragAdapter extends FragmentPagerAdapter {
    //1.创建Fragment数组
    private List<Fragment> mFragments;
    //2.接收从Activity页面传递过来的Fragment数组
    public FragAdapter(FragmentManager fm,List<Fragment> fragments){
        super(fm);
        mFragments = fragments;
    }
    @Override
    public Fragment getItem(int i) {
        return mFragments.get(i);
    }
    @Override
    public int getCount() {
        return mFragments.size();
    }
}

    FragMent1.java

package com.example.fragmenttest;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Fragment1 extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
       //1.创建View视图
        View view = inflater.inflate(R.layout.layout1,container,false);
        //2.返回view视图
        return  view ;
    }
}

    FragMent2.java

package com.example.fragmenttest;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Fragment2 extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.layout2,container,false);
        return  view;
    }
}

    FragMent3.java

package com.example.fragmenttest;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Fragment3 extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.layout3,container,false);
        return  view;
    }
}

    MainActivity.java

package com.example.fragmenttest;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends FragmentActivity {

    private ViewPager viewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //1.构造Fragment列表
        List<Fragment> fragments = new ArrayList<Fragment>();
        //2.将前面定义的三个Fragment类对应的实例放入Fragment列表
        fragments.add(new Fragment1());
        fragments.add(new Fragment2());
        fragments.add(new Fragment3());
        //3.构造Fragment适配器
        FragAdapter adapter = new FragAdapter(getSupportFragmentManager(),fragments);
        //4.创建ViewPager实例,并绑定适配器
        viewPager = findViewById(R.id.viewpager);
        viewPager.setAdapter(adapter);

    }
}

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐