转 Fragment 和 FragmentActivity的使用
今天学习下 Android中的 Fragment 和 FragmentActivity,因为没有4.0手机,平台是2.3.3 所以我是使用 v4 support 包来进行学习。
要想用Fragment 功能必须先让activity继承FragmentActivity,其原因是里面包含了Fragment运作的FragmentManager接口的实现类 FragmentManagerImpl ,由这个类管理所有Fragment的显示、隐藏
1.使用最简单的Fragment,我们只要继承Fragment就可以
- public class TextFragment extends Fragment{
- private String mMsg;
- public void setMessage(String message){
- this.mMsg = message;
- }
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- final Context context = getActivity();
- FrameLayout root = new FrameLayout(context);
- root.setBackgroundColor(Color.YELLOW);
- TextView tv = new TextView(context);
- tv.setText(mMsg);
- tv.setGravity(Gravity.CENTER);
- root.addView(tv, new FrameLayout.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));
- return root;
- }
- }
首先Fragment 就可以把它当作一个view , 只不过这个view 与 activity一样有了生命周期函数
Fragment.onCreateView() 函数就是用于生成这个Fragment布局的view的,类似baseadapter.getView()
这样一个包含一个TextView的简单布局就完成了。
2.重写我们自己的FragmentActivity.
这里面主要要通过FragmentManager 来进行Fragment的添加和删除:
- public class DoorFragmentActivity extends FragmentActivity{
- public static final String FRAG_SMS = "sms_list_frag";
- public static final String FRAG_TEXT = "text_frag";
- private Fragment mSMSFragment;
- private Fragment mTextFragment;
- private FragmentManager mFragMgr;
- private Button mMenuBtn;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.door_fragment_activity_layout);
- mFragMgr = getSupportFragmentManager();
- mMenuBtn = (Button) findViewById(R.id.door_menu_btn);
- mMenuBtn.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- showFragments(FRAG_TEXT, true);
- }
- });
- mMenuBtn.setOnLongClickListener(new OnLongClickListener() {
- @Override
- public boolean onLongClick(View v) {
- // TODO Auto-generated method stub
- return false;
- }
- });
- initFragments();
- showFragments(FRAG_SMS, false);
- }
- private void initFragments(){
- mSMSFragment = new SMSListFragment();
- TextFragment textfrag = new TextFragment();
- textfrag.setMessage("这是 菜单界面");
- mTextFragment = textfrag;
- }
- private void showFragments(String tag, boolean needback){
- FragmentTransaction trans = mFragMgr.beginTransaction();
- if(needback){
- trans.setCustomAnimations(R.anim.frag_enter,
- R.anim.frag_exit);
- trans.add(R.id.door_root_content_fl, getFragmentByTag(tag), tag);
- trans.addToBackStack(tag);
- }else{
- trans.replace(R.id.door_contents_fl, getFragmentByTag(tag), tag);
- }
- trans.commit();
- }
- private Fragment getFragmentByTag(String tag){
- if(FRAG_SMS.equals(tag)){
- return mSMSFragment;
- }
- if(FRAG_TEXT.equals(tag)){
- return mTextFragment;
- }
- return null;
- }
- }
- 首先我们获取FragmentManager实现:直接调用 FragmentActivity.getSupportFragmentManager(),看源码可以知道这返回的是FragmentManager内部定义的实现类FragmentManagerImpl。
- 我们获取了FragmentManagerImpl后我们其实不咋操作这个类,只调用FragmentManager.beginTransation(),这个获取FragmentTransation接口的实现类(里面具体是BackStackRecord类的实例),我们关于Fragment的所有操作都是通过它来完成的,因为没仔细研究,我只了解直接自己在代码里面定义Fragment而没有在xml里面写(xml写觉得有点别扭)
我们主要通过 FragmentTransation的一些方法来处理Fragment的:
1) trans.add(fragment, tag); 这个实际是 containerViewId = 0 调用的3)
2) trans.add(containerViewId, fragment); 这个实际是 tag = null 调用的 3)
3) trans.add(containerViewId, fragment, tag); 如果containerViewId != 0实际上调用的是获取到
fragment的 onCreateView方法返回的view 并加入到containerViewId这个viewgroup中去即 viewgroup.addView(fragment.onCreateView());
未解决问题:containerViewId = 0 的时候代表什么??
4) trans.replace(containerViewId, fragment) 一样是null tag调用 5)
5) trans.replace(containerViewId, fragment, tag) 这个一样是添加一个fragment到对应的container中去,只不过比add多了一步对相同containerViewId中已有的fragment检索,进行removeFragment操作,再去添加这个新来的fragment
6) trans.addToBackStack(tag); 如果你的fragment对于back键有类似activity的回退响应,就要记得把它加入到里面去,trans里面模拟了栈,但是我的回退没有响应我设置的exit anim 这个无语还没解决
3.再使用下ListFragment,我这里写的是SMSListFragment继承了ListFragment:
- public class SMSListFragment extends ListFragment{
- private ConversationListAdapter mAdapter;
- private ConversationQuery mQuery;
- private long startTime;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- mAdapter = new ConversationListAdapter(getActivity());
- mQuery = new ConversationQuery(getActivity().getContentResolver());
- }
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onActivityCreated(savedInstanceState);
- setListAdapter(mAdapter);
- }
- @Override
- public void onStart() {
- // TODO Auto-generated method stub
- super.onStart();
- startAsyncQuery();
- }
- @Override
- public void onStop() {
- // TODO Auto-generated method stub
- super.onStop();
- mAdapter.getCursor().close();
- mAdapter.changeCursor(null);
- }
- public void startAsyncQuery() {
- startTime = System.currentTimeMillis();
- mQuery.startQuery(1, null, Conversation.sAllThreadsUri,
- Conversation.ALL_THREADS_PROJECTION, null, null,
- Conversation.CONVERSATION_ORDER);
- }
- private final class ConversationQuery extends AsyncQueryHandler {
- public ConversationQuery(ContentResolver cr) {
- super(cr);
- // TODO Auto-generated constructor stub
- }
- @Override
- protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
- // TODO Auto-generated method stub
- System.out.println("conversation cursor size : "
- + cursor.getCount());
- mAdapter.changeCursor(cursor);
- Toast.makeText(
- getActivity(),
- "查询短信会话个数:" + cursor.getCount() + ",花费"
- + (System.currentTimeMillis() - startTime) + " ms",
- Toast.LENGTH_LONG).show();
- }
- }
- }
代码中可以知道和使用普通的ListActivity完全没区别,
onCreate()中完成自己要一次性初始的东西,我在里面主要是初始化一个adapter和一个对sms数据库的查询
在onActivityCreated()中将adapter设置给listview,这个不确定有没有更好的位置,
然后进入我们熟悉的生命周期方法:
onStart()中,开启查询
onStop()中,我们界面已经不在显示了,所以我们不关心数据库变化了,close cursor
4.主页面的布局文件:
- <?xml version="1.0" encoding="utf-8"?>
- <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/door_root_content_fl"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
- <FrameLayout
- android:id="@+id/door_contents_fl"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1" />
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="55dp"
- android:orientation="horizontal" >
- <Button
- android:id="@+id/door_menu_btn"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:gravity="center"
- android:text="菜单" />
- </LinearLayout>
- </LinearLayout>
- </FrameLayout>
5.运行效果图:
转 Fragment 和 FragmentActivity的使用的更多相关文章
- Fragment与FragmentActivity的关系
前阵用viewpaper+fragment做滑动引导,查阅了下网上的资料,发现在有两种做法,一个是自建类直接继承Activity另一种是继承FragmentActivity,很是迷惑,在查了些goog ...
- Fragment 和 FragmentActivity的使用
Fragment 和 FragmentActivity的使用 http://blog.csdn.net/izy0001989624/article/details/17072211
- Fragment与FragmentActivity通信封装
在项目里面会经常用到Fragment与FragmentActivity,比如Fragment之间的界面切换与Fragment之间的值传递等等,为了方便起见我把Fragment和FragmentActi ...
- Fragment和FragmentActivity的使用方法
认识:首先我们知道Fragment是我们在单个Activity上要切换多个UI界面,显示不同内容.模块化这些UI面板以便提供给其他Acitivity使用便利.同时我们显示的Fragment也会受到当前 ...
- ☆ fragment和fragmentactivity解析 (转)
一.为什么要使用Fragment 1.当我们需要动态的多界面切换的时候,就需要将UI元素和Activity融合成一 个模块.在2.3中我们一般通过各种Activity中进行跳转来实现多界面的跳转和单 ...
- Fragment 和 FragmentActivity的使用(二)
今天继续完成剩下的学习部分,现在项目很多地方使用viewpager来提供滑动,今天记录学习viewpager配合fragment的显示,增加一个CallLogsFragment配合之前SMSLis ...
- android Fragment和FragmentActivity
MainActivity.java import android.app.AlertDialog; import android.app.Notification; import android.co ...
- Android Fragment和FragmentActivity区别和用法
Android Fragment是Android4.0以上才有的:而FragmentActivity是为了兼容4.0以下版本的Fragment使用的. 所以如果你想兼容4.0以下Android版本使用 ...
- fragment和fragmentactivity解析
一.为什么要使用Fragment 1.当我们须要动态的多界面切换的时候,就须要将UI元素和Activity融合成一个模块.在2.3中我们一般通过各种Activity中进行跳转来实现多界面的跳转和单个 ...
随机推荐
- 第一次点击button, view视图出现;第二次点击button,view视图消失
主要思想:点击一下按钮选中Yes,View出现,再点击一下选中为No view消失
- log4j配置详解[http://www.iteye.com/topic/378077]
log4j是一个非常强大的log记录软件,下面我们就来看看在项目中如何使log4j. 首先当然是得到log4j的jar档,推荐使用1.2.X版,下载地址: http://logging.apache. ...
- HDU 5348 MZL's endless loop
乱搞题...第一直觉是混合图的欧拉通路,但是感觉并没有多大关系.最终AC的做法是不断的寻找欧拉通路,然后给边标号.所有边访问了一遍,所有点访问了一遍,效率是o(n+m).不存在-1的情况. #incl ...
- Robot Framework开发系统关键字详细
本文的目的,是记录如何在rf下,开发属于自己的库函数(又称之系统关键字) 1.首先在..\Python27\Lib\site-packages目录下创建自定义库目录如Verification_Libr ...
- eclipse使用外部maven时multiModuleProjectDirectory错误解决
错误提醒: -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment vari ...
- JavaScript高级程序设计:第十二章
DOM1级主要定义的是HTML和XML文档的底层结构.DOM2和DOM3级则在这个结构的基础上引入了更多的交互能力,也支持了更高级的XML特性.为此DOM2和DOM3级分为许多模块,这些模块如下: D ...
- unlinking
When a file name is deleted from the directory tree, the file name's connection to the inode number ...
- Apache 与tomcat区别
Apache与Tomcat有什么关系和区别 经常在用apache和tomcat等这些服务器,可是总感觉还是不清楚他们之间有什么关系,在用tomcat的时候总出现apache,总感到迷惑,到底谁是主谁是 ...
- ASP.NET 会话状态的模式
ASP.NET 会话状态为会话数据提供了几个不同的存储选项.每个选项都通过一个 SessionStateMode 枚举值进行识别.如下列表中描述了可用的会话状态模式: InProc 模式:把会话状态存 ...
- 关于PHP静态方法调用和实例化类调用的区别
1.首先来澄清一些观点 由于静态方法在内存中只有一份,无论你调用多少次,都是共用的,而且没有对象的概念,所以不能在静态方法里面使用$this调用,如果非得调用的话,只能实例化自身类 而实例化不一样,每 ...