Android Fragments 详细使用详细介绍
其它推荐:
[原创]android版本飞鸽传书源码(附图)
Android植物大战僵尸对战版源码
实用源码——Android屏幕锁源码
Fragments 诞生初衷
自从Android 3.0中引入fragments 的概念,根据词海的翻译可以译为:碎片、片段。其上的是为了解决不同屏幕分辩率的动态和灵活UI设计。大屏幕如平板小屏幕如手机,平板电脑的设计使得其有更多的空间来放更多的UI组件,而多出来的空间存放UI使其会产生更多的交互,从而诞生了fragments 。fragments 的设计不需要你来亲自管理view hierarchy 的复杂变化,通过将Activity 的布局分散到frament 中,可以在运行时修改activity 的外观,并且由activity 管理的back stack 中保存些变化。
Fragments 设计理念
在设计应用时特别是Android 应用 ,有众多的分辨率要去适应,而fragments 可以让你在屏幕不同的屏幕上动态管理UI。例如:通讯应用程序(QQ),用户列表可以在左边,消息窗口在右边的设计。而在手机屏幕用户列表填充屏幕当点击某一用户时,则弹出对话窗口的设计,如下图:
Fragments的生命周期
每一个fragments 都有自己的一套生命周期回调方法和处理自己的用户输入事件。 对应生命周期可参考下图:
其中大多数程序必须使用Fragments 必须实现的三个回调方法分别为:
onCreate
系统创建Fragments 时调用,可做执行初始化工作或者当程序被暂停或停止时用来恢复状态,跟Activity 中的onCreate相当。
onCreateView
用于首次绘制用户界面的回调方法,必须返回要创建的Fragments 视图UI。假如你不希望提供Fragments 用户界面则可以返回NULL。
onPause
当用户离开这个Fragments 的时候调用,这时你要提交任何应该持久的变化,因为用户可能不会回来。更多的事件可以参考上图的生命周期关系图。
Fragments 的类别
系统内置了三种Fragments ,这三种Fragments 分别有不同的应用场景分别为:
DialogFragment
对话框式的Fragments,可以将一个fragments 对话框并到activity 管理的fragments back stack 中,允许用户回到一个前曾摒弃fragments.
ListFragments
类似于ListActivity 的效果,并且还提供了ListActivity 类似的onListItemCLick和setListAdapter等功能。
PreferenceFragments
类似于PreferenceActivity .可以创建类似IPAD的设置界面。
Fragments 的详细使用
首先先来看一张DEMO 效果图:
左边点击时,右边的字符会与左边选中的项的字符相同。与IPAD上的设置界面很相似,这一点是否借鉴了ipad 上的UI呢?
相就的XML文件:
<?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="horizontal" ><fragment class="com.xuzhi.fragment.FragmentDemoActivity$TitlesFragment" android:id="@+id/titles" android:layout_weight="1"android:layout_width="0px" android:layout_height="match_parent"/><FrameLayout android:id="@+id/details" android:layout_weight="1" android:layout_width="0px" android:layout_height="match_parent"android:background="?android:attr/detailsElementBackground"></FrameLayout> </LinearLayout>
主界面代码(己做注释):
package com.xuzhi.fragment; import android.app.Activity; import android.app.AlertDialog; import android.app.Fragment; import android.app.FragmentTransaction; import android.app.ListFragment; import android.os.Bundle; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.ScrollView; import android.widget.TextView;public class FragmentDemoActivity extends Activity {public static String[] array = { "text1,", "text2", "text3", "text4","text5,", "text6", "text7", "text8" };/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.main);}public static class TitlesFragment extends ListFragment {boolean mDualPane;int mCurCheckPosition = 0;@Overridepublic void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);System.out.println("Fragment-->onCreate");}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// TODO Auto-generated method stubSystem.out.println("Fragment-->onCreateView");return super.onCreateView(inflater, container, savedInstanceState);}@Overridepublic void onPause() {// TODO Auto-generated method stubsuper.onPause();System.out.println("Fragment-->onPause");}@Overridepublic void onStop() {// TODO Auto-generated method stubsuper.onStop();System.out.println("Fragment-->onStop");}@Overridepublic void onAttach(Activity activity) {// TODO Auto-generated method stubsuper.onAttach(activity);System.out.println("Fragment-->onAttach");}@Overridepublic void onStart() {// TODO Auto-generated method stubsuper.onStart();System.out.println("Fragment-->onStart");}@Overridepublic void onResume() {// TODO Auto-generated method stubsuper.onResume();System.out.println("Fragment-->onResume");}@Overridepublic void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();System.out.println("Fragment-->onDestroy");}@Overridepublic void onActivityCreated(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onActivityCreated(savedInstanceState);System.out.println("Fragment-->onActivityCreted");setListAdapter(new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1, array));View detailsFrame = getActivity().findViewById(R.id.details);mDualPane = detailsFrame != null&& detailsFrame.getVisibility() == View.VISIBLE;if (savedInstanceState != null) {mCurCheckPosition = savedInstanceState.getInt("curChoice", 0); //从保存的状态中取出数据 }if (mDualPane) {getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);showDetails(mCurCheckPosition);}}@Overridepublic void onSaveInstanceState(Bundle outState) {// TODO Auto-generated method stubsuper.onSaveInstanceState(outState);outState.putInt("curChoice", mCurCheckPosition);//保存当前的下标 }@Overridepublic void onListItemClick(ListView l, View v, int position, long id) {// TODO Auto-generated method stubsuper.onListItemClick(l, v, position, id);showDetails(position);}void showDetails(int index) {mCurCheckPosition = index; if (mDualPane) {getListView().setItemChecked(index, true);DetailsFragment details = (DetailsFragment) getFragmentManager().findFragmentById(R.id.details); if (details == null || details.getShownIndex() != index) {details = DetailsFragment.newInstance(mCurCheckPosition); //得到一个fragment 事务(类似sqlite的操作)FragmentTransaction ft = getFragmentManager().beginTransaction();ft.replace(R.id.details, details);//将得到的fragment 替换当前的viewGroup内容,add则不替换会依次累加ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);//设置动画效果ft.commit();//提交 }} else {new AlertDialog.Builder(getActivity()).setTitle(android.R.string.dialog_alert_title).setMessage(array[index]).setPositiveButton(android.R.string.ok,null).show();}}}/*** 作为界面的一部分,为fragment 提供一个layout* @author terry**/public static class DetailsFragment extends Fragment {public static DetailsFragment newInstance(int index) { DetailsFragment details = new DetailsFragment();Bundle args = new Bundle();args.putInt("index", index);details.setArguments(args);return details;}public int getShownIndex() {return getArguments().getInt("index", 0);}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// TODO Auto-generated method stubif (container == null)return null;ScrollView scroller = new ScrollView(getActivity());TextView text = new TextView(getActivity());int padding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, getActivity().getResources().getDisplayMetrics());text.setPadding(padding, padding, padding, padding);scroller.addView(text);text.setText(array[getShownIndex()]);return scroller;}} }
注意:
如果你想在Fragment 里面创建menu,则必须在onCreate的时候设置让它可以存在optionMenu才可以创建,代码为:
public static class DetailsFragment extends Fragment {@Overridepublic void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setHasOptionsMenu(true);} }
之后的操作即可以像平常Android的menu用法一样,代码为:
@Overridepublic void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {// TODO Auto-generated method stubsuper.onCreateOptionsMenu(menu, inflater);menu.add("Menu 1a").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);menu.add("Menu 1b").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// TODO Auto-generated method stubToast.makeText(getActivity(), "index is"+getShownIndex()+" && menu text is "+item.getTitle(), 1000).show();return super.onOptionsItemSelected(item);}
更多详细的使用方法,请参考SDK和APIDEMO中相关的例子和解释。
Android Fragments 详细使用详细介绍相关推荐
- android webview详情,Android中的WebView详细介绍
Android中WebView的详细解释: 1. 概念: WebView(网络视图)能加载显示网页,可以将其视为一个浏览器.它使用了WebKit渲染引擎加载显示网页. 2. 使用方法: (1).实例化 ...
- Android Studio ndk-Jni开发详细
2019独角兽企业重金招聘Python工程师标准>>> Android Studio ndk-Jni开发详细入门,Aes加密demo 字数920 阅读13 评论0 喜欢0 Java ...
- Android 系统(152)---Android多线程:HandlerThread详细使用手册
Android多线程:HandlerThread详细使用手册 前言 多线程的应用在Android开发中是非常常见的,常用方法主要有: 继承Thread类 实现Runnable接口 Handler As ...
- android:自己动手编译Android源码(超详细)
自己动手编译Android源码(超详细) 涅槃1992 2016.06.20 02:12* 字数 4330 阅读 86819评论 89喜欢 339赞赏 7 在Android Studio代码调试一文中 ...
- android application 方法,Android Studio新建Android application配置的详细方法
Android Studio如何新建Android application配置呢?下面是小编介绍的Android Studio新建Android application配置的详细方法,有需要的小伙伴一 ...
- Android webservice的用法详细讲解
Android webservice的用法详细讲解 看到有很多朋友对WebService还不是很了解,在此就详细的讲讲WebService,争取说得明白吧.此文章采用的项目是我毕业设计的webserv ...
- android 摄像头参数,获取Android设备上的详细的摄像头信息
原标题:获取Android设备上的详细的摄像头信息 如何获取Android设备上的详细的摄像头信息呢? 目前Samsung的Galaxy Tab和Nexus S均有前置摄像头,获取Android摄像头 ...
- 车辆保险详细说明举例介绍
轉:http://blog.163.com/cheliang_baoxian/blog/static/180520164201111883859383/ 车辆保险详细说明举例介绍 交强险 交强险是法律 ...
- Android 短信数据库详细总结分析
Android 短信数据库详细总结分析 短信 sms 文件 /data/data/com.android.providers.telephony/databases/mmssms.db 这个数据库 ...
- Android连接夜神模拟器详细步骤
Android连接夜神模拟器详细步骤 做毕设用到了android stdio,好久不用也生疏了,记录一下. (1)打开并运行夜神模拟器, (2)打开命令行窗口,win+R,并输入cmd. (3)找到并 ...
最新文章
- 举例分析Linux动态库和静态库
- 查看linux服务器硬盘IO读写负载
- Matplotlib实例教程(九)热力图
- git gui怎么拉取项目代码_Git GUI使用方法【转】
- request请求在Struts2中的处理步骤
- 解决火狐https问题 安全连接问题
- python3读取本地_Python3 获取本机 IP
- 冒泡排序及其三种优化方案
- 基于SSD目标检测模型的人脸口罩识别
- 图解数字签名-数字证书-公钥加密-私钥签名原理
- nginx搭建flv、mp4流媒体服务器
- 【linux】分卷压缩
- 英语基本句型及一般时态
- 大地测量控制点坐标转换技术规范
- 自定义gii生成模块
- 微信小程序| Ngork内网传统+后台API通信例子
- 全国计算机照片怎么弄,证件照电子版怎么弄-制作证件照其实很简单,用excel就行,2分钟搞定...
- android 获取 meid 代码,Android 各个版本获取IMEI、MEID
- I-Deas TMG 培训资料 (10)
- js的for循环中return可以跳出循环,而使用forEach等不可以跳出循环