android fragment学习,Android 学习系列 - Fragment

Android Fragment

关于

Fragment代表了 Activity的子模块,因此可以把Fragment理解成Activity片段。Fragment用于自己的生命周期,也可以接受它自己的输入事件。

Fragment必须被“嵌入” Activity中使用,因此虽然Fragment也拥有自己的生命周期,但Fragment的生命周期会受它所在的Activity的生命周期的控制。例如,当Activity暂停时,该Activity内的所有Fragment都会暂停;当Activity被销毁时,该Activity内的所有Fragment 都会被销毁,只有当该Activity处于活动状态时,程序员可通过方法独立地操作Fragment。

fragment引入的原因是为了响应式适配:

例子: tablet , phone

tablet-main-activity{

navFragment + contentFragment

}

phone-main-activity {

navFragment

}

phone-content-activity{

contentFragment

}

与Activity类似的是,Fragment也存在如下状态。

活动状态:当前Fragment位于前台,用户可见,可以获得焦点。

暂停状态:其他Activity位于前台,该Fragment依然可见,只是不能获得焦点。

停止状态:该Fragment不可见,失去焦点。

销毁状态:该Fragment被完全删除,或该Fragment所在的Activity被结束。

Fragment 特征

Fragment总是作为Activity界面的组成部分,Fragment可调用getActivity()方法获取它所在的 Activity, Activity调用FragmentManager 的findFragmentByld()或findFragmentByTag()方法来获取Fragment。

在Activity 运行过程中,可调用 FragmentManager 的add()、remove()、replace()方法动态地添加、删除或替换Fragment。

—个Activity可以同时组合多个Fragment;反过来,一个Fragment也可被多 Activity 复用。

Fragment可以响应自己的输入事件,并拥有自己的生命周期,但它们的生命周期直接被其所属的Activity的生命周期控制。

创建fragment

fragment类关系

android.app.Fragment

extends Object

implements ComponentCallbacks2 View.OnCreateMenuListener

subclass

DialogFragment, ListFragment, PreferenceFragment, WebViewFragment

生命周期回调方法

// 当该Fragment被添加到Activity时被回调。该方法只会被调用一次

onAttatch()

// 系统创建Fragment对象后回调该方法,实现代码中只初始化想要在

// Fragment中保持的必要组件,当fragment被暂停或者停止后可以恢复。

onCreate() ->

// 当Fragment绘制界面组件时会回调该方法。该方法必须返回一个View,

// 该View也就是该Fragment所显示的View。

onCreateView() ->

// 当 Fragment 所在的 Activity 被启动完成后回调该方法

onActivityCreated()

// 启动 Fragment 时被回调

onStart ->

// 恢复 Fragment 时被回调,onStart()方法后一定会回调()onResume()方法

onResume ->

// 当用户离开该Fragment时将会回调该方法。

onPause ->

onStop() ->

// 销毁该 Fragment 所包含的 View 组件时调用

onDestroyView() ->

// 销毁Fragment时被回调。该方法只会被调用一次。

onDestroy() ->

// 将该 Fragment 从 Activity 中被删除、被替换完成时回调该方法,onDestroy()

// 方法后一定会回调onDetach()方法。该方法只会被调用一次。

onDetach()

开发Fragment与开发Activity非常相似,区别只是开发Activity需要继承Activity或其子类;但开发Fragment需要继承Fragment及其子类, 与此同时,只要将原来写在Activity回调方法的代码“移到”Fragment的回调方法中即可。

sample

public class BookDetailFragment extends Fragment

{

public static final String ITEM_ID = "item_id";

// 保存该Fragment显示的Book对象

BookContent.Book book;

@Override

public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

// 如果启动该Fragment时包含了ITEM_ID参数

if (getArguments().containsKey(ITEM_ID))

{

book = BookContent.ITEM_MAP.get(getArguments()

.getInt(ITEM_ID)); //①

}

}

// 重写该方法,该方法返回的View将作为Fragment显示的组件

@Override

public View onCreateView(LayoutInflater inflater

, ViewGroup container, Bundle savedInstanceState)

{

// 加载/res/layout/目录下的fragment_book_detail.xml布局文件

View rootView = inflater.inflate(R.layout.fragment_book_detail,

container, false);

if (book != null)

{

// 让book_title文本框显示book对象的title属性

((TextView) rootView.findViewById(R.id.book_title))

.setText(book.title);

// 让book_desc文本框显示book对象的desc属性

((TextView) rootView.findViewById(R.id.book_desc))

.setText(book.desc);

}

return rootView;

}

}

Fragment 与activity的交互

如何应用fragment 到 activity 中

在布局文件中添加:在布局文件中使用元素添加Fragment,其中的android:name属性必须指定Fragment的实现类。

在Java代码中通过FragmentTransaction对象的relpace()或add()方法来替换或添加Fragment。Activity的getFragmentManager()方法返回FragmentManager,通过调用FragmentManager的beginTransaction()方法获取FragmentTransaction对象。

在activity中获取Fragement,在Fragment中获取activity的方法:

Fragment获取它所在的Activity:调用Fragment的getActivity()方法即可返回它所在的Activity。

Activity 获取它包含的Fragment:调用 Activity 关联的 FragmentManager 的 findFragmentByld(int id)或findFragmentByTag(String tag)方法即可获取指定的 Fragment。

在界面布局文件中使用元素添加Fragment时,可以为元素指定android:id或android:tag属性,这两个属性都可用于标识该 Fragment,接下来 Activity 将可通过 findFragmentByld(int id)或 findFragmentByTag(String tag)来获取该 Fragment。

Fragment与Activity可能还需要相互传递数据的方式

Activity向Fragment传递数据: 在Activity中创建Bundle数据包, 并调用Fragment 的setArguments(Bundle bundle)方法即可将 Bundle 数据包传给 Fragment。

Fragment向Activity传递数据或Activity需要在Fragment运行中进行实时通信: 在Fragment中定义一个内部回调接口,再让包含该Fragment的Activity实现该回调接口,这样Fragment即可调用该回调方法将数据传给Activity。

FragmentMange的功能

使用 findFragmentByld()或 findFragmentByTag()方法来获取指定 Fragment。

调用popBackStack()方法将Fragment从后台找中弹出(模拟用户按下BACK按键)。

调用addOnBackStackChangeListener()注册个监听器,用于监听后台栈的变化。如果需要添加、删除、替换Fragment,则需要借助FragmentTransaction对象, FragmentTransaction 代表 Activity 对 Fragment 执行的多个改变。

ragmentTransaction也被翻译为Fragment事务。与数据库事务类似的是,数据库事务代表了对底层数组的多个更新操作;而Fragment事务则代表了Activity对Fragment执行的多个改变操作。

每个FragmentTransaction可以包含多个对Fragment的修改,比如包含调用多个add()、replace()、和remove()操作,最后调用commit()提交事务即可。

在调用commit()之前,开发者也可调用addToBackStack()将事务添加到back栈,该栈由Activity负责管理,这样允许用户按BACK按键返回到前一个Fragment状态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值