极力推荐文章:欢迎收藏

Android 干货分享

阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android

本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:

  1. Fragment 的设计原理
  2. Fragment 的生命周期
  3. Fragment 在宿主Activity 中的生命周期
  4. Fragment 在Activity 中的使用方法
  5. Activity获取 Fragment 的方法
  6. Fragment 获取宿主Activity 的方法
  7. 两个Fragment 通讯的方法
  8. Fragment 与Activity 通讯方法

Fragment 片段,在Activity 中常用于负责用户界面部分,可以将多个Fragment 组合在一个Activity中来创建多窗口UI,或者在Activity中重复使用某个Fragment。您可以将Fragment 视为Activity的模块化组成部分,Fragment 具有自己的生命周期,能接收自己的输入事件,并且可以在Activity 运行时候添加或者移除Fragment

Fragment 必须嵌套在Activity中,其生命周期受Activity生命周期的影响。

Fragment 简介

Fragment 继承关系如下:

java.lang.Object
   ↳ android.app.Fragment

1. Fragment的设计原理

Fragment 主要是为了给大屏幕(平板等)上更加动态和灵活的UI设计提供支持。由于平板电脑的屏幕比手机屏幕大得多,因此可用于组合和交换UI 组件的空间更大。利用Fragment 实现此类设计时,您无需管理对视图层次结构的复杂更改。 通过将 Activity 布局分成Fragment,您可以在运行时修改 Activity 的外观,并在由 Activity 管理的返回栈中保留这些更改。

您应该将每个Fragment都设计为可重复使用的模块化 Activity 组件。也就是说,由于每个Fragment 都会通过各自的生命周期回调来定义其自己的布局和行为,您可以将一Fragment加入多个 Activity,因此,您应该采用可复用式设计,避免直接从某个Fragment直接操纵另一个Fragment。 这特别重要,因为模块化片段让您可以通过更改Fragment的组合方式来适应不同的屏幕尺寸。 在设计可同时支持平板电脑和手机的应用时,您可以在不同的布局配置中重复使用您的Fragment,以根据可用的屏幕空间优化用户体验。 例如,在手机上,如果不能在同一 Activity 内储存多个片段,可能必须利用单独片段来实现单窗格 UI

2.Fragment 生命周期

  • Fragment生命周期图

  • Fragment 生命周期回调方法
	public void onAttach(Context context) {
// TODO Auto-generated method stub
Log.i(TAG, "----onAttach----");
super.onAttach(context);
} @Override
public void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "----onCreate----");
// 在Fragment 中调用Activity 中的方法
((FragmentAutoCreate) getActivity()).test(); // TODO Auto-generated method stub
super.onCreate(savedInstanceState);
} @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.i(TAG, "----onCreateView----");
// 将layout布局转换成View
View view = inflater.inflate(R.layout.fragment_left_layout, null);
Toast.makeText(getActivity(),
"通过对外提供方法setMsg(String msg),供Activity 调用", 0).show();
return view; } @Override
public void onActivityCreated(Bundle savedInstanceState) {
Log.i(TAG, "----onActivityCreated----");
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
} @Override
public void onStart() {
Log.i(TAG, "----onStart----");
// TODO Auto-generated method stub
super.onStart();
} @Override
public void onResume() {
Log.i(TAG, "----onResume----");
// TODO Auto-generated method stub
super.onResume();
} @Override
public void onPause() {
Log.i(TAG, "----onPause----");
// TODO Auto-generated method stub
super.onPause();
} @Override
public void onStop() {
Log.i(TAG, "----onStop----");
// TODO Auto-generated method stub
super.onStop();
} @Override
public void onDestroyView() {
Log.i(TAG, "----onDestroyView----");
// TODO Auto-generated method stub
super.onDestroyView();
} @Override
public void onDestroy() {
Log.i(TAG, "----onDestroy----");
// TODO Auto-generated method stub
super.onDestroy();
} @Override
public void onDetach() {
Log.i(TAG, "----onDetach----");
// TODO Auto-generated method stub
super.onDetach();
}

3.Fragment 在宿主Activity 的生命周期

Fragment 不能脱离Activity而存在,其生命周期受Activity 生命周期影响

4.Fragment 在Activity中的使用方法

1.静态添加Fragment到Activity

1.创建自定义Fragment类

实现方法如下

public class FragmentRight extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// 将layout布局转换成View
View view = inflater.inflate(R.layout.fragment_right_layout, null); // 取出值
Bundle values = getArguments();
if (values != null) {
String str = values.getString("key", "");
Toast.makeText(getActivity(), "接收Activity传递的至为:" + str, 0).show(); } else {
Toast.makeText(getActivity(), "接收Activity传递的至为空", 0).show(); } return view; }
}

2.在Activity 的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"
android:background="@android:color/holo_orange_light"
android:orientation="vertical" > <TextView
android:id="@+id/right_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Fragment 获取Activity 传递的值 " /> </RelativeLayout>

2. 动态添加Fragment到Activity中

1.创建自定义Fragment类 同上

public class FragmentRight extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// 将layout布局转换成View
View view = inflater.inflate(R.layout.fragment_right_layout, null); // 取出值
Bundle values = getArguments();
if (values != null) {
String str = values.getString("key", "");
Toast.makeText(getActivity(), "接收Activity传递的至为:" + str, 0).show(); } else {
Toast.makeText(getActivity(), "接收Activity传递的至为空", 0).show(); } return view; }
}

2.创建Fragment填充布局载体

<LinearLayout 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" > <FrameLayout
android:id="@+id/fl_left"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#f00" /> <FrameLayout
android:id="@+id/fl_right"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:background="#0f0" /> </LinearLayout>

3.使用FragmentManager动态填充

1.创建容器接收Fragment Activity容器。

2.使用FragmentManagerFragment 进行交互

3.开启事务将Fragment 填充到Activity 创建的容器中

4.提交事务。

public class FragmentAutoCreate extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment_autocreate); // 获取fragmentManager --->开启事务--->容器中填充内容--->提交事务
// FragmentManager : Activity 内部用来与Fragment进行交互的接口
FragmentManager fragmentManager = getFragmentManager();
// 开启一个事务
FragmentTransaction transaction = fragmentManager.beginTransaction();
// 将左右两侧的Fragment 添加的R.id.fl_left 所代表的容器视图中
FragmentLeft leftFragment = new FragmentLeft();
transaction.add(R.id.fl_left, leftFragment, "left_tag");
// 1. 调用 Fragment 对外提供的方法
leftFragment.setMsg("tttt"); FragmentRight rightFragment = new FragmentRight();
// 2. Activity --setArguments-> 创值给Fragment
Bundle args = new Bundle();
args.putString("key", "Activity --setArguments-> 创值给Fragment ");
// 传递数据
rightFragment.setArguments(args);
transaction.add(R.id.fl_right, rightFragment);
// transaction.replace(R.id.fl_right, rightFragment);
// transaction.hide(rightFragment);
transaction.show(rightFragment); // 提交事务
transaction.commit(); } public void test() { }
}

5.Activity 中获取Fragment

		Fragment idFragment=getFragmentManager().findFragmentById(R.id.fl_left);
FragmentRight tagFragment = (FragmentRight) getFragmentManager().findFragmentByTag("left_tag");

6.Fragment 获取宿主Activity的方法

  • getActivity() 方法获取宿主Activity
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.i(TAG, "----onCreateView----");
// 将layout布局转换成View
View view = inflater.inflate(R.layout.fragment_left_layout, null);
Toast.makeText(getActivity(),
"通过对外提供方法setMsg(String msg),供Activity 调用", 0).show();
return view; }

7.两个Fragment的通讯的方法

  • 通过宿主ActivityFragmentManger 方法获取不同的Fragment
		Fragment idFragment=getFragmentManager().findFragmentById(R.id.fl_left);
FragmentRight tagFragment = (FragmentRight) getFragmentManager().findFragmentByTag("left_tag");

8.Fragment 与 Activity通讯方法

1.Activity 调用 setArguments 方法

public class FragmentAutoCreate extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment_autocreate); // 获取fragmentManager --->开启事务--->容器中填充内容--->提交事务
// FragmentManager : Activity 内部用来与Fragment进行交互的接口
FragmentManager fragmentManager = getFragmentManager();
// 开启一个事务
FragmentTransaction transaction = fragmentManager.beginTransaction();
// 将左右两侧的Fragment 添加的R.id.fl_left 所代表的容器视图中
FragmentLeft leftFragment = new FragmentLeft();
transaction.add(R.id.fl_left, leftFragment, "left_tag");
// 1. 调用 Fragment 对外提供的方法
leftFragment.setMsg("tttt"); FragmentRight rightFragment = new FragmentRight();
// 2. Activity --setArguments-> 创值给Fragment
Bundle args = new Bundle();
args.putString("key", "Activity --setArguments-> 创值给Fragment ");
// 传递数据
rightFragment.setArguments(args);
transaction.add(R.id.fl_right, rightFragment);
// transaction.replace(R.id.fl_right, rightFragment);
// transaction.hide(rightFragment);
transaction.show(rightFragment); // 提交事务
transaction.commit(); } public void test() { }
}

2.通过Fragment 对外提供接口方法

通过Fragment 对外提供接口方法,供Activity调用

public class FragmentLeft extends Fragment {

	private static final String TAG = "   F   wj";
private String mMessage; public void setMsg(String msg) {
this.mMessage = msg;
} @Override
public void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "----onCreate----");
// 在Fragment 中调用Activity 中的方法
((FragmentAutoCreate) getActivity()).test(); // TODO Auto-generated method stub
super.onCreate(savedInstanceState);
} @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.i(TAG, "----onCreateView----");
// 将layout布局转换成View
View view = inflater.inflate(R.layout.fragment_left_layout, null);
Toast.makeText(getActivity(),
"通过对外提供方法setMsg(String msg),供Activity 调用", 0).show();
return view; }

至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

Fragment 使用详解的更多相关文章

  1. Android Fragment用法详解(2)--动态添加Fragment

    在上一篇文章<Android Fragment用法详解(1)--静态使用Fragment>我们讲解了Fragment的最简单的用法.这次我们来说一说Fragment复杂一丢丢的用法.在代码 ...

  2. Android Fragment用法详解(1)--静态使用Fragment

    先说明一下,本例子是运行在Android Studio下面的.同样的代码复制粘贴到Eclipse运行却会报错.具体原因我也没有细查.知道的哥们,留言通知下呗. Fragment,也就是碎片,本意是为了 ...

  3. android之Fragment基础详解(一)

      一.Fragment的设计哲学 Android在3.0中引入了fragments的概念,主要目的是用在大屏幕设备上--例如平板电脑上,支持更加动态和灵活的UI设计.平板电脑的屏幕比手机的大得多,有 ...

  4. Android Fragment 使用详解

    虽然网上有很多关于Fragment的文章,但我这里还是要写这篇笔记,因为我在编写程序的过程中发现了一个问题,至今未解决,希望得到大家的帮助: PS:当我在Fragment中定义一个名为setIndex ...

  5. Fragment详解之三——管理Fragment(1)

    相关文章: 1.<Fragment详解之一--概述>2.<Fragment详解之二--基本使用方法>3.<Fragment详解之三--管理Fragment(1)>4 ...

  6. ViewPager 详解(五)-----使用Fragment实现ViewPager滑动

    前言:前几篇文章讲解了ViewPager的普通实现方法,但Android官方最推荐的一种实现方法却是使用fragment,下面我们使用fragment来重新实现一下第一篇<ViewPager 详 ...

  7. Ajax.ActionLink参数详解

    该语法会生成一个a标签,点击a标签会执行一个Ajax请求. 有12个方法重载,下面详解方法中的各项参数: 参数一:linkText string类型 说明:链接显示的文字内容 参数二:actionNa ...

  8. ActionBar详解

    转: 一.ActionBar介绍 在Android 3.0中除了我们重点讲解的Fragment外,Action Bar也是一个非常重要的交互元素,Action Bar取代了传统的tittle bar和 ...

  9. iptables详解

    Netfilter包含有三种表,三种表下共包含有五种链,链下面包含各种规则.即表包含若干链,链包含若干规则.  (一)三种表为:filter   nat  mangle 1.filter:处理与本机有 ...

随机推荐

  1. 关于java中构造方法、实例初始化、静态初始化执行顺序

    在Java笔试中,构造方法.实例初始化.静态初始化执行顺序,是一个经常被考察的知识点. 像下面的这道题(刚刚刷题做到,虽然做对了,但是还是想整理一下) 运行下面的代码,输出的结果是... class ...

  2. 用kubeadm创建高可用kubernetes集群后,如何重新添加控制平面

    集群信息 集群版本:1.13.1 3个控制平面,2个worker节点 k8s-001:10.0.3.4 k8s-002:10.0.3.5 k8s-003:10.0.3.6 k8s-004:10.0.3 ...

  3. C++ 洛谷P1230 智力大冲浪

    题目描述 小伟报名参加中央电视台的智力大冲浪节目.本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元.先不要太高兴!因为这些钱还不一定都是你的?!接下来主持人宣布了比赛规则: ...

  4. mysql双机热备实现方案

    一.概念 1.热备份和备份的区别 热备份指的是:High Available(HA)即高可用,而备份指的是Backup,数据备份的一种.这是两种不同的概念,应对的产品也是两种功能上完全不同的产品.热备 ...

  5. Linux命令学习-ls命令

    Linux中,ls命令的全称是list,主要作用是列出当前目录下的清单. 列出Linux根目录下的所有目录 ls / 列出当前目录下所有文件夹和文件 ls 列出当前目录下所有文件夹和文件(包括以&qu ...

  6. 开源FTP/SFTP客户端 FileZilla v3.31.0 绿色便携版

    下载地址:点我 基本介绍 FileZilla是一种快速.可信赖的FTP客户端以及服务器端开放源代码程式,具有多种特色.直觉的接口.可控性.有条理的界面和管理多站点的简化方式使得Filezilla客户端 ...

  7. C# 收集几条ToString()格式

    .ToString("C");//¥1,200.00 .ToString("D3");//025 string r3 = 2500.1231.ToString( ...

  8. Bzoj 1997 [Hnoi2010]Planar题解

    1997: [Hnoi2010]Planar Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2224  Solved: 824[Submit][Stat ...

  9. Vue状态管理之Bus

    一般在项目中,状态管理都是使用Vue官方提供的Vuex 当在多组件之间共享状态变得复杂时,使用Vuex,此外也可以使用Bus来进行简单的状态管理 1.1 父组件与子组件之间的通信 vue.config ...

  10. 2019.6.16完成classstack任务

    最终信息 4 ShineEternal 任务完成,账号已注销 120 149 80.537%