Android之Fragment
一、Fragment的用法
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;
publicclass FragmentDemoActivity extends Activity {
publicstatic String[] array = { "text1,", "text2", "text3", "text4",
"text5,", "text6", "text7", "text8" };
/** Called when the activity is first created. */
@Override
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
publicstaticclass TitlesFragment extends ListFragment {
boolean mDualPane;
int mCurCheckPosition = 0;
@Override
publicvoid onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
System.out.println("Fragment-->onCreate");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
System.out.println("Fragment-->onCreateView");
returnsuper.onCreateView(inflater, container, savedInstanceState);
}
@Override
publicvoid onPause() {
// TODO Auto-generated method stub
super.onPause();
System.out.println("Fragment-->onPause");
}
@Override
publicvoid onStop() {
// TODO Auto-generated method stub
super.onStop();
System.out.println("Fragment-->onStop");
}
@Override
publicvoid onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
System.out.println("Fragment-->onAttach");
}
@Override
publicvoid onStart() {
// TODO Auto-generated method stub
super.onStart();
System.out.println("Fragment-->onStart");
}
@Override
publicvoid onResume() {
// TODO Auto-generated method stub
super.onResume();
System.out.println("Fragment-->onResume");
}
@Override
publicvoid onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
System.out.println("Fragment-->onDestroy");
}
@Override
publicvoid onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.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);
}
}
@Override
publicvoid onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
outState.putInt("curChoice", mCurCheckPosition);//保存当前的下标
}
@Override
publicvoid onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.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
*
*/
publicstaticclass DetailsFragment extends Fragment {
publicstatic DetailsFragment newInstance(int index) {
DetailsFragment details = new DetailsFragment();
Bundle args = new Bundle();
args.putInt("index", index);
details.setArguments(args);
return details;
}
publicint getShownIndex() {
return getArguments().getInt("index", 0);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
if (container == null)
returnnull;
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才可以创建,代码为:
publicstaticclass DetailsFragment extends Fragment {@Override
publicvoid onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
}之后的操作即可以像平常Android的menu用法一样,代码为:
@Override
publicvoid onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// TODO Auto-generated method stub
super.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);
}@Override
publicboolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
Toast.makeText(getActivity(), "index is"+getShownIndex()+" && menu text is "+item.getTitle(), 1000).show();
returnsuper.onOptionsItemSelected(item);
}
更多详细的使用方法,请参考SDK和APIDEMO中相关的例子和解释。
http://www.cnblogs.com/TerryBlog/archive/2012/02/17/2355753.html
使用Fragment创建应用
http://wiki.eoe.cn/page/Fragments.html
Android UI开发第十七篇——Android Fragment实例
http://blog.csdn.net/xyz_lmn/article/details/6930753
二、兼容android3.0以下版本用法
在1.6上使用需要借助android-support-v4.jar包实现。android-support-v4.jar在:SDK根目录\extras\android\compatibility\v4下可以找到,如果想了解Fragment在SDK1.6上怎么实现的请参考Fragment 在Android SDK1.6上实现。
三、关于加载不同的Fragment时所需要的菜单选项不一样的问题。
Activity在加载一个新的Fragment时会重新生成菜单,也就是会再次调用onCreateOptionsMenu(Menu menu)。注意:不是每次加载Fragment都会重新调用onCreateOptionsMenu(Menu menu)。只有在要加载的Fragment上注明过setHasOptionsMenu(true);在加载到Activity是会调用onCreateOptionsMenu(Menu menu)。由此进行加载Fragment判断后就可以对不同的Fragment加载不同的菜单。同时也可以通过此方法恢复初始菜单项。
转载于:https://blog.51cto.com/4789781/1268831
Android之Fragment相关推荐
- android viewpager 嵌套fragment,Android ViewPager+Fragment多层嵌套(使用问题处理)
之前写了Android ViewPager+Fragment(使用问题处理),封装了一个BaseFragment,对于简单使用ViewPager+Fragment而言,是没有问题的. 不过,ViewP ...
- Android 在Fragment中执行onActivityResult不被调用的简单解决方法
Android 在Fragment中执行onActivityResult不被调用的简单解决方法 参考文章: (1)Android 在Fragment中执行onActivityResult不被调用的简单 ...
- android碎片按钮,Android 碎片(Fragment)
Android 碎片(Fragment) 碎片是活动的一部分,使得活动更加的模块化设计.我们可以认为碎片是一种子活动. 下面是关于碎片的重要知识点 - 碎片拥有自己的布局,自己的行为及自己的生命周期回 ...
- Android 进阶 Fragment 介绍和使用 (一)
Fragment概述 Fragment是activity的界面中的一部分或一种行为.你可以把多个Fragment们组合到一个activity中来创建一个多面界面并且你可以在多个activity中重用一 ...
- Android之Fragment使用简介
Fragment是Android 3.0 (API level 11)后推出的新功能.Android3.0以前的版本也能用Fragment,不过得给工程导入一个android-support-v4.j ...
- android 之Fragment的详解
友情链接:点击打开链接 1.将Activity传值到Fragment 具体步骤: <1>声明碎片事务器对象 private FragmentManager fragmentManager; ...
- 三个activity之间跳转 数据传递_第二百四十二回:Android中Fragment之间的数据传递概述...
各位看官们大家好,上一回中咱们说的是Android中Activity之间数据传递的例子,这一回咱们说的例子是Fragment之间的数据传递.闲话休提,言归正转.让我们一起Talk Android吧! ...
- Android之 Fragment
什么是Fragment: Android是在Android 3.0 (API level 11)开始引入Fragment的. 可以把Fragment想成Activity中的模块,这个模块有自己的布局, ...
- Android之Fragment 真正的完全解析(上)
转载出处:http://blog.csdn.net/lmj623565791/article/details/37970961 自从Fragment出现,曾经有段时间,感觉大家谈什么都能跟Fragme ...
- Android(2)-----Fragment //(第七周后的知识)
1.Fragmentandroid.app.Fragment版本://v4版本是为了由3.0向下兼容到1.6,改那个Fragment文件里的import android.support.v4.app. ...
最新文章
- Java控制内存的功力
- 安卓高手之路之图形系统【5】安卓ListView和EditText配合使用时的注意事项。
- 错误 - 无法访问IIS元数据库
- 彻底理解Spring IOC和DI
- Oracle分组取出每组的第一笔数据
- 通用类别目录Global Catalog[为企业维护windows server 2008系列五]
- 爬取IMDBTOP250
- c语言中width获取窗体宽度,获取屏幕宽高width(),outerWidth,innerWidth,clientWidth的区别...
- 常用邮箱SMTP/POP3地址及端口
- 清华大学操作系统OS学习(四)——物理内存管理:连续内存分配
- css3 animation 位置移动了怎么不占位置_手把手整理CSS3知识汇总【思维导图】
- 解决SQL数据库无法附加
- java服装销售系统课程设计_毕业论文(设计)基于javaweb的服装销售管理系统的设计与实现.doc...
- 抢红包案例分析以及代码实现
- 浙江省等保测评机构项目测评收费价格标准参考
- Taro 3.x 开发 APP 记录 (持续记录中。。。)
- [精华]世界顶级防火墙LooknStop配置详解
- springboot+臻绿原客绿色食品商城 毕业设计-附源码161928
- weblogic wls-wsat组件远程命令执行(CVE-2017-3506)
- General error: 1366 Incorrect string value: '\xF0\x9F\x98\x8A' for column
热门文章
- 用WebCollector制作一个爬取《知乎》并进行问题精准抽取的爬虫(JAVA)
- mysql 批量删除之大坑
- 生成patch的diff命令是怎么写的?
- django界面上弹出bootstrap modal对话框,对话框中包含iframe并请求一个新的页面
- Target Unreachable, identifier 'userInfoUpdateBean' resolved to null 错误问题描述以及解决
- vue-cli@4安装Element-ui
- git常用命令+git规范(附merge合并及冲突解决)
- Java 面向对象:多态的理解
- node php环境变量配置,关于NodeJS、NPM安装配置步骤(windows版本) 以及环境变量的介绍...
- vue避免重新渲染_详解强制Vue组件重新渲染的方法