一、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;
       }
   }
}

注意:

  1. 如果你想在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相关推荐

  1. android viewpager 嵌套fragment,Android ViewPager+Fragment多层嵌套(使用问题处理)

    之前写了Android ViewPager+Fragment(使用问题处理),封装了一个BaseFragment,对于简单使用ViewPager+Fragment而言,是没有问题的. 不过,ViewP ...

  2. Android 在Fragment中执行onActivityResult不被调用的简单解决方法

    Android 在Fragment中执行onActivityResult不被调用的简单解决方法 参考文章: (1)Android 在Fragment中执行onActivityResult不被调用的简单 ...

  3. android碎片按钮,Android 碎片(Fragment)

    Android 碎片(Fragment) 碎片是活动的一部分,使得活动更加的模块化设计.我们可以认为碎片是一种子活动. 下面是关于碎片的重要知识点 - 碎片拥有自己的布局,自己的行为及自己的生命周期回 ...

  4. Android 进阶 Fragment 介绍和使用 (一)

    Fragment概述 Fragment是activity的界面中的一部分或一种行为.你可以把多个Fragment们组合到一个activity中来创建一个多面界面并且你可以在多个activity中重用一 ...

  5. Android之Fragment使用简介

    Fragment是Android 3.0 (API level 11)后推出的新功能.Android3.0以前的版本也能用Fragment,不过得给工程导入一个android-support-v4.j ...

  6. android 之Fragment的详解

    友情链接:点击打开链接 1.将Activity传值到Fragment 具体步骤: <1>声明碎片事务器对象 private FragmentManager fragmentManager; ...

  7. 三个activity之间跳转 数据传递_第二百四十二回:Android中Fragment之间的数据传递概述...

    各位看官们大家好,上一回中咱们说的是Android中Activity之间数据传递的例子,这一回咱们说的例子是Fragment之间的数据传递.闲话休提,言归正转.让我们一起Talk Android吧! ...

  8. Android之 Fragment

    什么是Fragment: Android是在Android 3.0 (API level 11)开始引入Fragment的. 可以把Fragment想成Activity中的模块,这个模块有自己的布局, ...

  9. Android之Fragment 真正的完全解析(上)

    转载出处:http://blog.csdn.net/lmj623565791/article/details/37970961 自从Fragment出现,曾经有段时间,感觉大家谈什么都能跟Fragme ...

  10. Android(2)-----Fragment //(第七周后的知识)

    1.Fragmentandroid.app.Fragment版本://v4版本是为了由3.0向下兼容到1.6,改那个Fragment文件里的import android.support.v4.app. ...

最新文章

  1. Java控制内存的功力
  2. 安卓高手之路之图形系统【5】安卓ListView和EditText配合使用时的注意事项。
  3. 错误 - 无法访问IIS元数据库
  4. 彻底理解Spring IOC和DI
  5. Oracle分组取出每组的第一笔数据
  6. 通用类别目录Global Catalog[为企业维护windows server 2008系列五]
  7. 爬取IMDBTOP250
  8. c语言中width获取窗体宽度,获取屏幕宽高width(),outerWidth,innerWidth,clientWidth的区别...
  9. 常用邮箱SMTP/POP3地址及端口
  10. 清华大学操作系统OS学习(四)——物理内存管理:连续内存分配
  11. css3 animation 位置移动了怎么不占位置_手把手整理CSS3知识汇总【思维导图】
  12. 解决SQL数据库无法附加
  13. java服装销售系统课程设计_毕业论文(设计)基于javaweb的服装销售管理系统的设计与实现.doc...
  14. 抢红包案例分析以及代码实现
  15. 浙江省等保测评机构项目测评收费价格标准参考
  16. Taro 3.x 开发 APP 记录 (持续记录中。。。)
  17. [精华]世界顶级防火墙LooknStop配置详解
  18. springboot+臻绿原客绿色食品商城 毕业设计-附源码161928
  19. weblogic wls-wsat组件远程命令执行(CVE-2017-3506)
  20. General error: 1366 Incorrect string value: '\xF0\x9F\x98\x8A' for column

热门文章

  1. 用WebCollector制作一个爬取《知乎》并进行问题精准抽取的爬虫(JAVA)
  2. mysql 批量删除之大坑
  3. 生成patch的diff命令是怎么写的?
  4. django界面上弹出bootstrap modal对话框,对话框中包含iframe并请求一个新的页面
  5. Target Unreachable, identifier 'userInfoUpdateBean' resolved to null 错误问题描述以及解决
  6. vue-cli@4安装Element-ui
  7. git常用命令+git规范(附merge合并及冲突解决)
  8. Java 面向对象:多态的理解
  9. node php环境变量配置,关于NodeJS、NPM安装配置步骤(windows版本) 以及环境变量的介绍...
  10. vue避免重新渲染_详解强制Vue组件重新渲染的方法