Android Fragment学习之二、Fragement的使用方法

一、概述

每一个Activiy都有一个Fragment的管理器FragmentManager来管理包含的Fragment。在API 11以上可以通过getFragmentManager();来获取,在API 11 以下,需要继承V4包中的FragmentActivity,可以通过调用getSupportFragmentManager();来获取。Fragment Manager就可以来管理Fragment了,而且提供了FragmentTransaction来添加移除替换Fragment。
Fragment在使用的时候分为静态调用和动态加载两种方式。

二、Fragment静态调用

         Fragment静态调用比较简单,只需要在Activity的布局中使用fragment标签即可。有一点需要注意的是Android在3.0(API 11)之后提出的Fragment,所以为了支持3.0以下系统的设备,Google一支持包的方式来向下兼容。但是支持包内的和系统的是两套相对独立的代码,不可混淆使用下面通过示例来进行Fragment静态调用用法的说明,首先瞄一眼最后实现的效果。

1. 系统Fragment静态调用

         使用系统Fragment需要最低版本为11,在适配低版本手机的时候通常不采用这种方式,随着3.0以后版本占市场绝大对数之后应该会变为主流的方式。

(1). 创建Activity继承android.app.Activity

package com.kevin.fragmentlearn03.activity;

import com.kevin.fragmentlearn03.R;

import android.app.Activity;
import android.os.Bundle;

public class AppActivity extends Activity{

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

}

这里和我们之前写Activity都是一样的,继承自android.app.Activity。

(2). 创建Fragment继承android.app.Fragment
package com.kevin.fragmentlearn03.view;

import com.kevin.fragmentlearn03.R;

import android.annotation.SuppressLint;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class AppFragment extends Fragment{
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		return inflater.inflate(R.layout.fragment_app, null);
	}

}

创建我们自己的Fragment继承自android.app.Fragment,重写onCreatView()方法,为什么要重写这个方法,在《Fragment学习之一、Fragment生命周期》中已经讲过,该生命周期方法就是填充该Fragment显示内容的。说直白点就是我们想要这个Fragment显示什么布局就在这里设置布局文件。

(3). 添加fragment标签到布局

<?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" >

    <fragment
        android:id="@+id/app_fragment"
        android:name="com.kevin.fragmentlearn03.view.AppFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

把我们创建的Fragment添加到宿主Activity,只需要在该宿主Activity的布局文件引用创建的Fragment即可,添加fragment标签,并且设置标签的name属性为所创建的Fragment类全名称。

2. V4Fragment静态调用

(1). 创建Activity继承android.support.v4.app.FragmentActivity

package com.kevin.fragmentlearn03.activity;

import com.kevin.fragmentlearn03.R;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

public class AppV4Activity extends FragmentActivity{

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

}

与平时创建Activity不同的一点就是这里继承的不是android.app.Activity 而是android.support.v4.app.Activity。也很好理解,在3.0之前的Activity类中是没有操作Fragment的FragmentManager的,Google在支持包为我们提供好了。

(2). 创建Fragment继承android.support.v4.app.Fragment

package com.kevin.fragmentlearn03.view;

import com.kevin.fragmentlearn03.R;

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

public class AppV4Fragment extends Fragment{

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		return inflater.inflate(R.layout.fragment_v4_app, null);
	}

}

上面的Fragment和之前创建的Fragment在代码上完全一致,只不过是这个导入android.support.v4.app.Fragment包,上一个导入android.app.Fragment包。填充的布局也比较简单,都为相对布局内包裹一个TextView。

(3). 添加fragment标签到布局

<?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" >

    <fragment
        android:id="@+id/app_v4_fragment"
        android:name="com.kevin.fragmentlearn03.view.AppV4Fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

这里和上面添加fragment标签相同。

至此Fragment静态调用以及向下兼容就讲解完了,然后继续分析Fragment的动态加载。

三、Fragment动态加载

下面通过示例来进行Fragment动态加载用法的说明,先来看一下最终实现的效果。


1. 系统Fragment动态加载

(1). 创建Activity继承android.app.Activity

package com.kevin.fragmentlearn04.activity;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;

import com.kevin.fragmentlearn04.R;

@SuppressLint("NewApi")
public class AppActivity extends Activity{

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE); // 隐藏系统标题栏
		setContentView(R.layout.activity_app);
	}

}
(2). 编写Activity布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="48dip"
        android:background="#8866FF00"
        android:gravity="center"
        android:text="@string/fragment_app_title"
        android:textSize="22sp" />

    <FrameLayout
        android:id="@+id/fragment_app_contect"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" >
    </FrameLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
    ……

</LinearLayout>

这里底部的四个按键就不写上了,很简答上面为FrameLayout,底部为三个按钮。

(3). 创建Fragment继承android.app.Fragment

package com.kevin.fragmentlearn04.fragment;

import com.kevin.fragmentlearn04.R;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class AppFragmentContact extends Fragment{
	

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		return inflater.inflate(R.layout.fragment_layout, null);
	}
	
	@Override
	public void onViewCreated(View view, Bundle savedInstanceState) {
		super.onViewCreated(view, savedInstanceState);
	}

}
复写了onCreateView来初始化布局,在onViewCreated里面来对布局事件处理。

(4). Activity内动态切换Fragment

package com.kevin.fragmentlearn04.activity;

import com.kevin.fragmentlearn04.R;
import com.kevin.fragmentlearn04.fragment.AppFragmentContact;
import com.kevin.fragmentlearn04.fragment.AppFragmentDynamic;
import com.kevin.fragmentlearn04.fragment.AppFragmentMessage;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;

public class AppActivity extends Activity implements OnClickListener{

    //……省略部分代码

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE); // 隐藏系统标题栏
		setContentView(R.layout.activity_app);
		
		initViews();
		initEvents();
		
        // 初始化Fragment Manager
		fragmentManager = getFragmentManager();
		
		FragmentTransaction ft = fragmentManager.beginTransaction();
		ft.replace(R.id.fragment_app_contect, new AppFragmentMessage());
		ft.commit();
	}

    //……省略部分代码

	@Override
	public void onClick(View v) {
		
		// 开启Fragment事务
		ft = fragmentManager.beginTransaction();
		switch (v.getId()) {
		case R.id.btn_app_act_message:
			mAppFragmentMessage = mAppFragmentMessage == null ? new AppFragmentMessage() : mAppFragmentMessage;
			// 用Fragment替换 fragment_app_contect 控件
			ft.replace(R.id.fragment_app_contect, mAppFragmentMessage);
			// 事务提交
			ft.commit();
			break;
		case R.id.btn_app_act_contact:
			mAppFragmentContact = mAppFragmentContact == null ? new AppFragmentContact() : mAppFragmentContact;
			// 用Fragment替换 fragment_app_contect 控件
			ft.replace(R.id.fragment_app_contect, mAppFragmentContact);
			// 事务提交
			ft.commit();
			break;
		case R.id.btn_app_act_dynamic:
			mAppFragmentDynamic = mAppFragmentDynamic == null ? new AppFragmentDynamic() : mAppFragmentDynamic;
			// 用Fragment替换 fragment_app_contect 控件
			ft.replace(R.id.fragment_app_contect, mAppFragmentDynamic);
			// 事务提交
			ft.commit();
			break;
		}
	}
}

2. V4Fragment动态加载

(1). 创建Activity继承android.support.v4.app.FragmentActivity

package com.kevin.fragmentlearn04.activity;

import com.kevin.fragmentlearn04.R;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.Window;

public class AppV4Activity extends FragmentActivity{

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE); // 隐藏系统标题栏
		setContentView(R.layout.activity_v4_app);
	}
	
}

(2). 编写Activity布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="48dip"
        android:background="#8866FF00"
        android:gravity="center"
        android:text="@string/fragment_app_title"
        android:textSize="22sp" />

    <FrameLayout
        android:id="@+id/fragment_app_contect"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" >
    </FrameLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
    ……

</LinearLayout>

(3). 创建Fragment继承android.support.v4.app.Fragment

package com.kevin.fragmentlearn04.fragment;

import com.kevin.fragmentlearn04.R;

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

public class AppV4FragmentContact extends Fragment{

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		return inflater.inflate(R.layout.fragment_layout, null);
	}
	
	@Override
	public void onViewCreated(View view, Bundle savedInstanceState) {
		super.onViewCreated(view, savedInstanceState);
	}

}

(4). Activity内动态切换Fragment

package com.kevin.fragmentlearn04.activity;

import com.kevin.fragmentlearn04.R;
import com.kevin.fragmentlearn04.fragment.AppV4FragmentContact;
import com.kevin.fragmentlearn04.fragment.AppV4FragmentDynamic;
import com.kevin.fragmentlearn04.fragment.AppV4FragmentMessage;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;

/**
 * 版权所有:----有限公司</br>
 * 
 * MainActivity </br>
 * 
 * @author zhou.wenkai ,Created on 2015-4-16 14:51:45</br>
 * Major Function:V4包Fragment动态加载</br>
 * 
 * 注:如果您修改了本类请填写以下内容作为记录,如非本人操作劳烦通知,谢谢!!!</br>
 * @author mender,Modified Date Modify Content:
 */
public class AppV4Activity extends FragmentActivity implements OnClickListener{

    //……省略部分代码

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE); // 隐藏系统标题栏
		setContentView(R.layout.activity_v4_app);
		
		initViews();
		initEvents();
		
		fragmentManager = getSupportFragmentManager();
		
		FragmentTransaction ft = fragmentManager.beginTransaction();
		ft.replace(R.id.fragment_app_contect, new AppV4FragmentMessage());
		ft.commit();
	}
	
    //……省略部分代码

	@Override
	public void onClick(View v) {
		// 开启Fragment事务
		ft = fragmentManager.beginTransaction();
		switch (v.getId()) {
		case R.id.btn_app_act_message:
			mAppV4FragmentMessage = mAppV4FragmentMessage == null ? new AppV4FragmentMessage() : mAppV4FragmentMessage;
			ft.replace(R.id.fragment_app_contect, mAppV4FragmentMessage);
			// 提交Fragment事务
			ft.commit();
			break;
		case R.id.btn_app_act_contact:
			mAppV4FragmentContact = mAppV4FragmentContact == null ? new AppV4FragmentContact() : mAppV4FragmentContact;
			ft.replace(R.id.fragment_app_contect, new AppV4FragmentContact());
			// 提交Fragment事务
			ft.commit();
			break;
		case R.id.btn_app_act_dynamic:
			mAppV4FragmentDynamic = mAppV4FragmentDynamic == null ? new AppV4FragmentDynamic() : mAppV4FragmentDynamic;
			ft.replace(R.id.fragment_app_contect, mAppV4FragmentDynamic);
			// 提交Fragment事务
			ft.commit();
			break;
		}
	}
}

四、总结

该文主要介绍了Fragment的静态调用以及动态加载的简单使用。以下做下总结:

1. Fragment静态调用

(1). 继承系统Fragment

①. 创建我们的AppActivity继承android.app.Activity;

②. 创建我们的AppFragment继承android.app.Fragment;

③. 在AppActivity的布局文件添加fragment标签,name属性为AppFragment类全名。

(2). 继承V4包Fragment

①. 创建我们的AppV4Activity继承android.support.v4.app.FragmentActivity;

②. 创建我们的AppV4Fragment继承android.support.v4.app.Fragment;

③. 在AppV4Activity的布局文件添加fragment标签,name属性为AppV4Fragment类全名。

2. Fragment动态加载

(1). 继承系统Fragment

①. 创建我们的Activity继承android.app.Activity;

②. 编写Activity的布局;

③. 创建Fragment继承android.app.Fragment;

④. Activity内通过getFragmentManager()获取FragmentManager然后开启事务动态加载Fragment。

(2). 继承V4包Fragment

①. 创建我们的Activity继承android.support.v4.app.Activity;

②. 编写Activity的布局;

③. 创建Fragment继承android.support.v4.app.Fragment;

④. Activity内通过getSupportFragmentManager()获取FragmentManager然后开启事务动态加载Fragment。

3. Fragment常用知识点

(1). 相关类

①. android.support.v4.app.FragementActivity向下兼容的Fragment的Activity;

②.android.support.v4.app.Fragment、android.app.Fragment 用于创建Fragment,其中android.app.Fragment要求最低版本为API 11,android.support.v4.app.Fragment作向下兼容;

③. android.support.v4.app.FragmentTransaction、android.app.FragmentTransaction用于Fragment的原子操作,用过数据库的朋友应该很熟悉;

(2). FragmentManager获取方式

①. Activity继承Activity:FragmentManagerfragmentManager = getFragmentManager();

②. Activity继承自FragmentActivity:FragmentManagerfragmentManager = getSupportFragmentManager();

(3). FragmentTransaction事务操作方法

         ①.开启事务:FragmentTransaction ft = fragmentManager.beginTransaction();

         ②.添加Fragment:ft.add();

         ③.隐藏Fragment:ft.hide();

         ④. 显示Fragment:ft.show();

         ⑤.移除Fragment:ft.remove();

         ⑥.替换Fragment:ft.replace();

         ⑦.提交事务:ft.commit();

五、下载传送门

1. Fragment静态调用相关源码

        Fragment静态调用

2. Fragment动态加载相关源码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android Fragment 是一种可重用的界面部件,它可以独立于 Activity 运行并与其他 Fragment 组合在一起形成一个完整的界面。Fragment 可以在不同的 Activity 之间共享,这样可以减少代码重复并提高代码复用率。使用 Fragment 需要继承 Fragment 类并重写 onCreateView 方法来创建界面。然后使用 FragmentManager 和 FragmentTransaction 来动态添加、移除和替换 Fragment。 ### 回答2: Android FragmentAndroid 应用中的一种重要的组件,它是一种可以嵌入到 Activity 中的可重用 UI 组件。一个 Activity 可以包含多个 Fragment,一个 Fragment 可以被多个 Activity 包含。 使用 Fragment,可以实现 UI 动态加载、数据隔离、模块化开发。在实现不同分辨率、屏幕模式的支持时,Fragment 提供了更方便的管理方式。 Fragment 生命周期包括以下几个状态: 1. 初始化阶段:调用 onCreate 方法; 2. 可视阶段:调用 onCreateView 方法,创建 Fragment 中的 view; 3. 已添加到 Activity 中:调用 onActivityCreated 方法; 4. 可交互阶段:调用 onStart 方法Fragment 可以与用户进行交互; 5. 在前台阶段:调用 onResume 方法; 6. 可离屏阶段:调用 onPause 方法; 7. 完全不可见阶段:调用 onStop 方法; 8. 销毁阶段:调用 onDestroyView 方法、onDestroy 方法、onDetach 方法。 在使用 Fragment 的过程中,我们需要了解以下几个常用的类: 1. FragmentFragment 的基础类,需要重载多个生命周期方法; 2. FragmentManager: 管理 Fragment 的类,包括 Fragment 的添加、移除、替换、显示、隐藏等操作; 3. FragmentTransaction: Fragment 操作类,封装了一组可以在 FragmentManager 上执行的操作。 在使用 Fragment 的时候,一般需要实现以下步骤: 1. 在 Activity 中定义一个容器,用于存放 Fragment 对象; 2. 创建 Fragment 对象; 3. 将 Fragment 对象添加到容器中; 4. 在 Fragment 中定义 UI 和数据绑定等处理。 例如,我们可以在 Activity 中定义一个容器,然后通过 FragmentManager 创建一个 Fragment 对象,并将其添加到容器中: ``` FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); MyFragment myFragment = new MyFragment(); transaction.add(R.id.container, myFragment); transaction.commit(); ``` 在 Fragment 中,我们可以定义 UI 并进行数据绑定: ``` public class MyFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_my, container, false); TextView textView = view.findViewById(R.id.text_view); textView.setText("Hello Fragment"); return view; } } ``` 这样,我们就可以在 Activity 中加载 Fragment,并在 Fragment 中显示 UI 和数据信息。 总而言之,使用 Android Fragment 可以使我们更好地进行模块化开发、实现 UI 动态加载、数据隔离、屏幕适配等功能。同时,在开发过程中,需要熟悉 Fragment 的生命周期及常用类的使用方法,才能更加高效地进行开发。 ### 回答3: Android Fragment(片段)是Android开发中一个重要的概念,它可以轻松地将一个Activity划分为多个子部分,每个部分可以独立地进行操作。正因为如此,Fragment成为了很多应用开发中的标配。 Fragment适用于动态UI、动态加载和给大屏幕设备提供一个更加灵活的界面。Fragment可以被看做是Activity中的一个小模块,可实现模块化编程,当然Fragment的生命周期也不同于Activity,系统对它的管理也是不同的。 切割UI界面为小块(模块),实现模块化程度,Fragment使用可以提供更好的用户界面体验。例如,在平板电脑中列表在右边,详细视图在左边,而在普通手机中这个列表是单独呈现的,这时候使用Fragment就可以轻易地划分页面布局,做到简洁协调。 为了使用Fragment,首先需要了解一些重要的概念: Fragment的生命周期:与Activity的生命周期相似,包括onCreate()、onStart()、onResume()、onPause()、onStop()和onDestroy()等方法Fragment管理:Android提供了FragmentManager和FragmentTransaction两个类来管理Fragment的添加、删除、替换等等操作。需要注意的是,Fragment的管理和Activity的管理是有区别的。 使用Fragment时,还需要注意以下几点: 1. Fragment 的激活必须通过 FragmentTransaction 的commit() 函数实现,否则不会被添加到 FragmentManager。 2. 通过使用layout创建一个包含 Fragment 的Activity布局,再通过 FragmentManager 加载相应的 Fragment,通过这种方式可以实现 Fragment 管理和Fragment 之间的通讯。 3. Fragment 可以嵌套使用,即一个 Fragment可以只是另一个 Fragment的一部分,这种设计可以更好的重用代码和布局。 总之,Android Fragment使用为应用程序开发带来了很多好处。它可以提高程序的灵活性和可扩展性,有助于构建清晰的UI体系结构,并支持模块化编程。使用Fragment的开发者可以通过Activity、Fragment和它们之间的通信来创建更加动态、灵活和易于维护的Android应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值