本文转载于 : http://blog.csdn.net/shulianghan/article/details/38064191

本博客代码地址 :

-- 单一 Fragment 示例 : https://github.com/han1202012/Octopus-Fragement.git

-- 可复用的 Fragment 示例 https://github.com/han1202012/Octopus-Fragement_TwoModel.git

1. Fragement 概述

Fragement 与 Activity 生命周期关系 : Fragement 嵌入到 Activity 组件中才可以使用, 其生命周期与 Activity 生命周期相关.

-- stop 与 destroy 状态 : Activity 暂停 或者 销毁的时候, 其内部嵌入的所有的 Fragement 也会执行 暂停 或者 销毁 操作;

-- 活动状态 : 只有当 Activity 处于活动状态的时候, 我们才能操作 Fragement;

Fragement 特征 :

-- Fragement 与 Activity 交互 : Fragement 调用 getActivity() 获取其 所嵌入的 Activity, Activity 获取 FragementManager
的findFragementById() 或 findFragementByTag()
 获取 Fragement;

-- Activity 增删 Fragement : Activity 调用 Fragement 的 add()remove()replace() 等方法
添加 删除 替换 Fragement;

-- Fragement 与 Activity 对应关系 : 一个 Activity 中可以嵌入多个 Fragement, 一个 Fragement 可以嵌入多个 Activity;

-- 生命周期受 Activity 影响 : Fragement 的生命周期 受 Activity 生命周期控制;

Fragement 作用 :  Fragement 是为了 Android 中 平台电脑 UI 设计, 开发者不用设计 非常负责的 界面, 只需要设计好模块, 对UI 组件进行分组 和 模块化的设计和开发,
简化了 UI 组件;

Fragement 可复用性 : 同一个 app 应用, 可以在不同的 Activity 中加载同一个 Fragement;

2. Fragement 类 和 方法介绍

(1) Fragement 相关类介绍

Fragement 子类 :

-- DialogFragement : 对话框界面的 Fragement, 显示一个浮动的对话框, 这个对话框可以方便的与 Activity 进行交互, Activity 可以管理这个 Fragment;

-- ListFragement : 列表界面的 Fragement, 显示一个条目列表, 该列表可以设置一个适配器, 提供了许多管理 列表的函数;

-- PerformanceFragement : 选项设置界面的 Fragement, 该Fragment 创建 类似与 设置 应用程序时很管用;

-- WebViewFragement : WebView 界面的 Fragement;

(2) Fragement 生命周期相关方法介绍

onCreate() :

[java] view
plain
copy

  1. onCreate(Bundle savedInstanceState)

-- 回调时机 : 在创建 Fragement 的时候回调;

-- 参数解析 : Bundle savedInstance, 用于保存 Fragment 参数, Fragement
也可以 重写 onSaveInstanceState(Bundle outState) 方法, 保存Fragement状态;

-- 执行的动作 : 获取 Frgement 显示的内容, 以及启动Fragment 传入的参数, 调用 getArguments() 获取键值对;

onCreateView() :

[java] view
plain
copy

  1. onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState);

-- 回调时机 : Fragement 绘制界面组件 的时候回调, 该方法返回 View, 这个View就是 Fragement 本身;

-- 参数解析 : inflater 布局加载器, 是上下文传入, 不用自己创建; container 加载组件的父容器;

-- 执行的操作 : 使用 inflate 布局加载器 加载布局文件, 并未组件设置显示的值;

onPause() :

-- 回调时机 : Fragement 暂停的时候, 即进入后台的时候 回调;

3. Fragment 创建

Fragment 创建 :

-- 参数准备 : 创建一个 Bundle 对象, 并向其中设置参数 :

[java] view
plain
copy

  1. Bundle bundle = new Bundle();
  2. bundle.putString("key", "value");

-- 创建 Fragment 对象 : 使用 new MyFragment() 创建对象, 并 调用 myFragment.setArguments(bundle) 方法传入参数;

[java] view
plain
copy

  1. MyFragment myFragment = new MyFragment();
  2. myFragment.setArguments(bundle);

Fragment嵌入Activity方式 : Fragment 添加到 Activity 中才能显示, 以下是将 Fragment 嵌入 Activity 的方式;

-- 布局文件嵌入 : 在布局文件中 使用 <Fragment /> 元素, 通过定义 android:name = "com.example.MyFragment" 属性指定 Fragment 类;

-- 代码方式嵌入 : 调用 FragmentTransaction 对象的 add() 方法向 Activity 中添加 Fragment;

4. Fragment 与 Activity 通信

Fragment 获取 Activity : 调用 Fragment 对象的 getActivity()方法, 即可获取 Fragment 嵌入的 Activity 对象;

Activity 获取 Fragment :

-- Fragment 属性 : 在布局文件中, 可以为 <Fragment /> 元素指定 android:id 和 android:tag 属性;

-- 获取方法 : 调用 Activity 的 findFragmentById(int id) 或者 findFragmentByTag(String tag)方法;

Fragment 向 Activity 传递数据 : 将 Activity 当作接口子类对象, Fragment 中调用 Activity 中的接口方法;

-- Fragment 定义接口 : 在 Fragment 内部定义一个 Callback 接口;

-- Activity 实现该接口 : MyActivity extends Activity implement MyFragment.Callback;

-- Fragment 中获取该接口对象 : 在Fragment 中定义一个 Callback 全局变量, 然后在 onAttach(Activity activity) 方法中, 将activity 强转为 Callback 对象;

-- 调用接口方法 : 上面获取了 Callback 对象, 即Activity对象, 调用 Activity 中的 接口方法, 就能在 Fragment 中调用 Activity 对应的方法了;

Activity 向 Fragment 传递数据 :

-- 创建 Bundle 数据包 : 创建一个 Bundle 对象, 把要存放的键值对 放到这个对象中;

-- 设置 Bundle 对象给 Fragment : 调用 Fragment 对象的 setArguments(Bundle bundle) 方法, 将 Bundle 对象设置给 Fragment;

5. Fragment 事务管理

FragmentManager 功能 : FragmentManager 对象 可以通过 activity.getFragmentManager()获取;

-- 获取指定 Fragment : 通过 findFragmentById() 或者 findFragmentByTag() 方法获取指定 Fragment;

-- 弹出栈 : 通过调用 popBackStack(), 将 Fragment 从后台的 栈 中弹出;

-- 监听栈 : 通过调用 addOnBackStackChangeListener 注册监听器, 监听 后台栈变化;

FragmentTransaction 对象获取途径 :

-- 获取 FragmentManager 对象 : 调用 Activity 的 getFragmentManager() 获取 FragmentManager 对象;

-- 获取 FragmentTansaction 对象 : 调用 FragmentManager 对象的 beginTransaction() 方法获取 FragmentTransaction 对象;

FragmentTransaction(Fragment 事务)作用 : 对 Fragement 进行 增, 删 , 改 操作需要 FragmentTransaction 对象进行操作, 开启 这个事务, 获取 事务对象, 然后执行对 Fragment 的操作, 最后提交事务;

-- 开启事务 :  调用 Fragement 对象的 beginTransaction() 方法可以获取 FragementTransaction 对象;

-- 操作碎片 :  FragmentTransaction 对象 中 包含了 add(), remove(), replace() 等方法;

-- 提交操作 :  当执行完 Fragement 的操作之后, 可以调用 FragementTransaction 对象的 commit() 方法提交修改;

addToBackStack()方法作用 : 该方法是 FragementTransaction 的方法, 在提交事务前调用该方法, 可以将 事务中执行的操作 添加到 back 栈中, 用户按下 回退键, 修改过的 Fragement 会 回退到 事务执行之前的状态;

6. Fragment 生命周期

(1) Fragment 状态

活动状态 : Fragment 处于前台, 可见可以获取焦点;

暂停状态 : Fragment 嵌入的Activity 也处于暂停状态, 即 Fragment 处于后台, 可见失去焦点;

停止状态 : Fragement 嵌入的 Activity 处于停止状态, 不可见失去焦点;

销毁状态 : Fragement 所在的 Activity 被销毁, 执行了 onDestroy() 方法, 此时 Fragement 被完全删除;

(2) Fragement 生命周期相关方法

红色方法 与 Activity 相对应, 蓝色方法 是 自身对应的方法, 棕色方法 单独对应;

onAttach() : 嵌入, Fragement 被嵌入到 Activity 时回调该方法, 只会调用一次;

onCreate() : 创建, Fragement 创建的时候回调该方法, 只会回调一次;

onCreateView() : 绘制, 在 Fragement 绘制的时候回调该方法, 该方法会返回 绘制的 View 组件;

onActivityCreated() : 界面创建, Fragement 所嵌入的 Activity 创建完成回调该方法;

onStart() : 启动, Fragement 启动时回调, 此时Fragement可见;

onResume() : 激活, Fragement 进入前台, 可获取焦点时激活;

onPause() : 暂停, Fragement 进入后台, 不可获取焦点时激活;

onStop() : 停止, Fragement 不可见时回调;

onDestroyView() : 销毁组件, 销毁 Fragement 绘制的 View 组件时回调;

onDestroy() : 销毁, 销毁 Fragement 回调;

onDetach() : 移除, Fragement 从 Activity 中移除的时候回调;

7. 代码示例

(1) 需求分析

纵向手机屏幕 : 两个界面, 每个界面都有一个 Fragement,  一个Fragement显示新闻列表, 一个Fragement 显示新闻内容;

横向手机屏幕 : 一个界面, 两个Fragement, Fragement 显示内容与上面相同;

(2) 新闻标题 Fragment

存放新闻标题的 Fragment : NewsTittleFragment.java

[java] view
plain
copy

  1. package cn.org.octopus;
  2. import android.app.Activity;
  3. import android.app.ListFragment;
  4. import android.os.Bundle;
  5. import android.view.LayoutInflater;
  6. import android.view.View;
  7. import android.view.ViewGroup;
  8. import android.widget.ArrayAdapter;
  9. import android.widget.ListAdapter;
  10. import android.widget.ListView;
  11. /**
  12. * 内部类 :
  13. *      Callbacks接口
  14. *      Fragement中维护该接口子类对象
  15. *      需要Activity实现该接口, 实现接口方法
  16. *      Activity 在onAttach()方法中传入;
  17. *
  18. * 方法简介 :
  19. *      重写生命周期的 11 个方法;
  20. *      onAttach() 方法中, 传入所嵌入的Activity, 并判断是否嵌入正确
  21. *      onCreate() 方法中, 创建  Fragement 中 ListView 的适配器, 并将适配器设置给 ListView
  22. *      onDetach() 方法中, 将  Callbacks 接口子类对象置空
  23. *
  24. *      setChoiceMode() 设置ListView 的选择模式
  25. *      onListItemClick() ListView 的点击回调方法
  26. *  注意 Android
  27. *
  28. */
  29. public class NewsTittleFragment extends ListFragment {
  30. private Callbacks activityCallback;         /* 从 onAttach()方法中传入的 Callbacks 接口子类, 由 Activity 强制转换而来 */
  31. /** 定义回调接口
  32. *  接口用法 :
  33. *  1. 该 Fragement 所 Activity 实现该接口
  34. *  2. 该 Fragement 中 维护一个 该接口子类, 即 Activity
  35. *  3. 调用 Activity 接口子类的方法, 将数据传递给 Activity **/
  36. public interface Callbacks{
  37. public void onNewsSelect(int id);
  38. }
  39. /** Fragment 嵌入Activity */
  40. @Override
  41. public void onAttach(Activity activity) {
  42. super.onAttach(activity);
  43. System.out.println("onAttach");
  44. if ( ! ( activity instanceof Callbacks))
  45. System.out.println("Fragement in wrong Activity !");
  46. /* 为Activity中定义的Callbacks接口子类对象赋值 */
  47. activityCallback = (Callbacks) activity;
  48. }
  49. /** Fragement 创建
  50. *  进行设置适配器操作 */
  51. @Override
  52. public void onCreate(Bundle savedInstanceState) {
  53. super.onCreate(savedInstanceState);
  54. System.out.println("onCreate");
  55. /* 为 ListFragment 创建适配器
  56. * 注意使用的是 Android 自带的布局, 在 sdk\platforms\android-10\data\res\layout 目录下
  57. *  */
  58. ListAdapter adapter = new ArrayAdapter<News>(getActivity(), android.R.layout.simple_list_item_activated_1, android.R.id.text1, NewsContent.getInstance().news);
  59. /* 设置适配器 给 ListFragement */
  60. setListAdapter(adapter);
  61. }
  62. /** Fragment 绘制 */
  63. @Override
  64. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  65. Bundle savedInstanceState) {
  66. System.out.println("onCreateView");
  67. return super.onCreateView(inflater, container, savedInstanceState);
  68. }
  69. /** Activity 创建完毕 */
  70. @Override
  71. public void onActivityCreated(Bundle savedInstanceState) {
  72. super.onActivityCreated(savedInstanceState);
  73. System.out.println("onActivityCreated");
  74. }
  75. /** Fragement 进入可视状态 */
  76. @Override
  77. public void onStart() {
  78. super.onStart();
  79. System.out.println("onStart");
  80. }
  81. /** Fragement 进入激活状态 */
  82. @Override
  83. public void onResume() {
  84. super.onResume();
  85. System.out.println("onResume");
  86. }
  87. /** Fragement 进入暂停状态 */
  88. @Override
  89. public void onPause() {
  90. super.onPause();
  91. System.out.println("onPause");
  92. }
  93. /** Fragement 进入停止状态 */
  94. @Override
  95. public void onStop() {
  96. super.onStop();
  97. System.out.println("onStop");
  98. }
  99. /** 销毁 Fragement 显示组件 */
  100. @Override
  101. public void onDestroyView() {
  102. super.onDestroyView();
  103. System.out.println("onDestroyView");
  104. }
  105. /** 销毁 Fragement */
  106. @Override
  107. public void onDestroy() {
  108. super.onDestroy();
  109. System.out.println("onDestroy");
  110. }
  111. /** 将 Fragement 从 Activity 中删除 */
  112. @Override
  113. public void onDetach() {
  114. super.onDetach();
  115. System.out.println("onDetach");
  116. activityCallback = null;
  117. }
  118. /**
  119. * 列表对象被点击之后回调的方法
  120. */
  121. @Override
  122. public void onListItemClick(ListView l, View v, int position, long id) {
  123. super.onListItemClick(l, v, position, id);
  124. activityCallback.onNewsSelect((int) id);
  125. }
  126. /** 设定选择模式, 该列表默认不能选择, 可以设置为不能选择, 单选 和 多选
  127. *  ListView.CHOICE_MODE_NONE       不能选择
  128. *  ListView.CHOICE_MODE_SINGLE     单选
  129. *  ListView.CHOICE_MODE_MULTIPLE   多选
  130. *  */
  131. public void setChoiceMode(int choiceMode) {
  132. getListView().setChoiceMode(choiceMode);
  133. }
  134. }

(3) 新闻内容的 Fragment

存放新闻内容的 Fragment : NewsContentFragement.java;

[java] view
plain
copy

  1. package cn.org.octopus;
  2. import android.app.Fragment;
  3. import android.os.Bundle;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. import android.widget.TextView;
  8. public class NewsContentFragement extends Fragment {
  9. /* Bundle的key */
  10. public static final String TAG_NEWS_ID = "cn.org.octopus.news.tittle";
  11. private News news;
  12. @Override
  13. public void onCreate(Bundle savedInstanceState) {
  14. super.onCreate(savedInstanceState);
  15. /* 校验 参数中是否包含 TAG_NEWS_ID 键值*/
  16. boolean isIllegal = getArguments().containsKey(TAG_NEWS_ID);
  17. if(isIllegal){
  18. /* 如果包含 TAG_NEWS_ID 键值, 就会去键对应的 id */
  19. int id = getArguments().getInt(TAG_NEWS_ID);
  20. /* 从 NewsContent 单例对象中的 map 集合中获取 news 对象 */
  21. news = NewsContent.getInstance().news_map.get(id);
  22. }
  23. }
  24. @Override
  25. public void onSaveInstanceState(Bundle outState) {
  26. super.onSaveInstanceState(outState);
  27. }
  28. @Override
  29. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  30. Bundle savedInstanceState) {
  31. /* 加载布局文件 */
  32. View rootView = inflater.inflate(R.layout.fragment_news_content, container, false);
  33. /* 获取新闻标题组件 */
  34. TextView news_content_tittle = (TextView) rootView.findViewById(R.id.news_content_tittle);
  35. /* 获取新闻内容组件 */
  36. TextView news_content_content = (TextView) rootView.findViewById(R.id.news_content_content);
  37. if(null != news){
  38. /* 设置新闻标题 */
  39. news_content_tittle.setText(news.getTittle());
  40. /* 设置新闻内容 */
  41. news_content_content.setText(news.getContent());
  42. }
  43. return rootView;
  44. }
  45. }

(4) 新闻内容存储相关代码

新闻实体类 :

[java] view
plain
copy

  1. package cn.org.octopus;
  2. public class News {
  3. private int id;         //新闻序号
  4. private String tittle;  //新闻标题
  5. private String content; //新闻内容
  6. /** 构造方法  */
  7. public News(int id, String tittle, String content) {
  8. super();
  9. this.id = id;
  10. this.tittle = tittle;
  11. this.content = content;
  12. }
  13. public int getId() {
  14. return id;
  15. }
  16. public void setId(int id) {
  17. this.id = id;
  18. }
  19. public String getTittle() {
  20. return tittle;
  21. }
  22. public void setTittle(String tittle) {
  23. this.tittle = tittle;
  24. }
  25. public String getContent() {
  26. return content;
  27. }
  28. public void setContent(String content) {
  29. this.content = content;
  30. }
  31. /* 这里只返回标题, 是为了适配 ListFragement 时使用 */
  32. @Override
  33. public String toString() {
  34. //      return "News [id=" + id + ", tittle=" + tittle + ", content=" + content
  35. //              + "]";
  36. return tittle;
  37. }
  38. }

新闻数据 :

[java] view
plain
copy

  1. package cn.org.octopus;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6. public class NewsContent {
  7. /* 单例模式
  8. * 1. 私有 静态 本类成员变量
  9. * 2. 私有 构造 函数
  10. * 3. 公共 静态 函数, 检查本类成员变量是否为null, 返回本类成员变量 */
  11. private static NewsContent newsContent;
  12. public List<News> news;
  13. public Map<Integer, News> news_map;
  14. private NewsContent(){
  15. news = new ArrayList<News>();
  16. news_map = new HashMap<Integer, News>();
  17. News news1 = new News(0, "郭振玺敛财术", "7月30日,央视纪录频道CCTV-9总监刘文被带走。据相关报道,刘文被带走的原因是 “发现在纪录片对外采购上有财务问题”,另外,在一些高收视率的纪录片创作上,“涉嫌与隐性的植入广告有关的利益交换”。");
  18. News news2 = new News(1, "朝鲜新版5000朝元新钞无金日成头像", "韩国网刊《每日朝鲜》8月1日报道,已经开始流通的5000朝元新钞并未印金日成肖像,意味金日成肖像已从朝鲜货币上暂时消失。 旧版朝鲜5000元纸币上印有金日成头像。");
  19. News news3 = new News(2, "美国医生感染埃博拉", "菲律宾卫生部部长恩里克·奥尼亚说,目前菲律宾尚无埃博拉疫情。卫生部已通报地方卫生部门,一旦发现返菲海外劳工出现感染埃博拉病毒早期症状,立即对患者实行隔离治疗。卫生部还要求近期即将从海外回国的劳工如出现发烧、头痛、关节和肌肉疼痛、喉咙痛等症状,在回国前应获得所雇佣国家卫生部门的无感染证明,以避免埃博拉病毒传入菲律宾。");
  20. news.add(news1);
  21. news.add(news2);
  22. news.add(news3);
  23. news_map.put(news1.getId(), news1);
  24. news_map.put(news2.getId(), news2);
  25. news_map.put(news3.getId(), news3);
  26. }
  27. /**
  28. * 判断成员变量 是否为null
  29. *  如果不为null, 直接返回;
  30. *  如果为null, 先创建在返回;
  31. */
  32. public static NewsContent getInstance() {
  33. if(newsContent != null)
  34. return newsContent;
  35. else
  36. return new NewsContent();
  37. }
  38. }

(5) 主界面 Actiity 代码

主界面代码 : MainActivity.java

[java] view
plain
copy

  1. package cn.org.octopus;
  2. import android.app.Activity;
  3. import android.app.FragmentManager;
  4. import android.app.FragmentTransaction;
  5. import android.os.Bundle;
  6. import cn.org.octopus.NewsTittleFragment.Callbacks;
  7. public class MainActivity extends Activity implements Callbacks {
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. /* 加载布局文件, 这个布局文件中有一个 Fragment, 会自动加载该 Fragmet */
  12. setContentView(R.layout.activity_main);
  13. }
  14. /**
  15. * 实现的 Callbasks 接口的方法,
  16. * 当 NewsTittleFragement 中的 ListView 被点击的时候 回调
  17. * */
  18. @Override
  19. public void onNewsSelect(int id) {
  20. /* 创建 Bundle 对象, Activity 传递给 Fragment 的参数需要靠该对象进行传递 */
  21. Bundle arguments = new Bundle();
  22. /* 封装数据到 Bundle 对象中, 注意提前定义好键值 */
  23. arguments.putInt(NewsContentFragement.TAG_NEWS_ID, id);
  24. /* 创建 Fragment 对象 */
  25. NewsContentFragement fragement = new NewsContentFragement();
  26. /* 将 Activity 要传递的数据 传递给 Fragment 对象 */
  27. fragement.setArguments(arguments);
  28. /* 获取FragmentManager 对象 */
  29. FragmentManager manager = getFragmentManager();
  30. /* 开启事务, 获取事务 */
  31. FragmentTransaction transaction =  manager.beginTransaction();
  32. /* 在事务中进行替换操作 */
  33. transaction.replace(R.id.news_content, fragement);
  34. /* 提交操作 */
  35. transaction.commit();
  36. }
  37. }

(6) AndroidManifest.xml 配置文件

[html] view
plain
copy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="cn.org.octopus"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6. <uses-sdk
  7. android:minSdkVersion="15"
  8. android:targetSdkVersion="19" />
  9. <application
  10. android:allowBackup="true"
  11. android:icon="@drawable/ic_launcher"
  12. android:label="@string/app_name"
  13. android:theme="@style/AppTheme" >
  14. <!--
  15. 设置屏幕方向 android:screenOrientation :
  16. unspecified : 默认值, 系统自动判定方向
  17. landscape : 横屏显示
  18. portrait : 竖屏显示
  19. user : 用户当前首选方向
  20. behind : 与 之前的 Activity 方向一致;
  21. sensor : 由物理传感器决定
  22. nosenser : 忽略物理传感器感应
  23. -->
  24. <activity
  25. android:name="cn.org.octopus.MainActivity"
  26. android:label="@string/app_name"
  27. android:screenOrientation="landscape">
  28. <intent-filter>
  29. <action android:name="android.intent.action.MAIN" />
  30. <category android:name="android.intent.category.LAUNCHER" />
  31. </intent-filter>
  32. </activity>
  33. </application>
  34. </manifest>

(7) 执行结果

跟踪的 Fragment 生命周期回调函数打印的结果 :

[plain] view
plain
copy

  1. I/System.out( 8604): onAttach
  2. I/System.out( 8604): onCreate
  3. I/System.out( 8604): onCreateView
  4. I/System.out( 8604): onActivityCreated
  5. I/System.out( 8604): onStart
  6. I/System.out( 8604): onResume
  7. I/System.out( 8604): onPause
  8. I/System.out( 8604): onStop
  9. I/System.out( 8604): onDestroyView
  10. I/System.out( 8604): onDestroy
  11. I/System.out( 8604): onDetach

界面执行结果 :

.

8. 出错处理

(1) 引用 不用包中的 Fragment

引用 android.app.ListFragment, 不会出现错误, 而 引用 android.support.v4.app.ListFragment 类会出现如下错误;

错误 :

[plain] view
plain
copy

  1. 08-06 22:17:12.537: E/AndroidRuntime(3751): FATAL EXCEPTION: main
  2. 08-06 22:17:12.537: E/AndroidRuntime(3751): java.lang.RuntimeException: Unable to start activity ComponentInfo{cn.org.octopus/cn.org.octopus.MainActivity}: android.view.InflateException: Binary XML file line #11: Error inflating class fragment
  3. 08-06 22:17:12.537: E/AndroidRuntime(3751):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2255)
  4. 08-06 22:17:12.537: E/AndroidRuntime(3751):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2309)
  5. 08-06 22:17:12.537: E/AndroidRuntime(3751):     at android.app.ActivityThread.access$700(ActivityThread.java:157)
  6. 08-06 22:17:12.537: E/AndroidRuntime(3751):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1289)
  7. 08-06 22:17:12.537: E/AndroidRuntime(3751):     at android.os.Handler.dispatchMessage(Handler.java:99)
  8. 08-06 22:17:12.537: E/AndroidRuntime(3751):     at android.os.Looper.loop(Looper.java:176)
  9. 08-06 22:17:12.537: E/AndroidRuntime(3751):     at android.app.ActivityThread.main(ActivityThread.java:5319)
  10. 08-06 22:17:12.537: E/AndroidRuntime(3751):     at java.lang.reflect.Method.invokeNative(Native Method)
  11. 08-06 22:17:12.537: E/AndroidRuntime(3751):     at java.lang.reflect.Method.invoke(Method.java:511)
  12. 08-06 22:17:12.537: E/AndroidRuntime(3751):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
  13. 08-06 22:17:12.537: E/AndroidRuntime(3751):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
  14. 08-06 22:17:12.537: E/AndroidRuntime(3751):     at dalvik.system.NativeStart.main(Native Method)
  15. 08-06 22:17:12.537: E/AndroidRuntime(3751): Caused by: android.view.InflateException: Binary XML file line #11: Error inflating class fragment
  16. 08-06 22:17:12.537: E/AndroidRuntime(3751):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:710)
  17. 08-06 22:17:12.537: E/AndroidRuntime(3751):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:752)
  18. 08-06 22:17:12.537: E/AndroidRuntime(3751):     at android.view.LayoutInflater.inflate(LayoutInflater.java:495)
  19. 08-06 22:17:12.537: E/AndroidRuntime(3751):     at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
  20. 08-06 22:17:12.537: E/AndroidRuntime(3751):     at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
  21. 08-06 22:17:12.537: E/AndroidRuntime(3751):     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:360)
  22. 08-06 22:17:12.537: E/AndroidRuntime(3751):     at android.app.Activity.setContentView(Activity.java:1932)
  23. 08-06 22:17:12.537: E/AndroidRuntime(3751):     at cn.org.octopus.MainActivity.onCreate(MainActivity.java:13)
  24. 08-06 22:17:12.537: E/AndroidRuntime(3751):     at android.app.Activity.performCreate(Activity.java:5326)
  25. 08-06 22:17:12.537: E/AndroidRuntime(3751):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)
  26. 08-06 22:17:12.537: E/AndroidRuntime(3751):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2218)
  27. 08-06 22:17:12.537: E/AndroidRuntime(3751):     ... 11 more
  28. 08-06 22:17:12.537: E/AndroidRuntime(3751): Caused by: android.app.Fragment$InstantiationException: Trying to instantiate a class cn.org.octopus.NewsTittleFragment that is not a Fragment
  29. 08-06 22:17:12.537: E/AndroidRuntime(3751):     at android.app.Fragment.instantiate(Fragment.java:584)
  30. 08-06 22:17:12.537: E/AndroidRuntime(3751):     at android.app.Fragment.instantiate(Fragment.java:560)
  31. 08-06 22:17:12.537: E/AndroidRuntime(3751):     at android.app.Activity.onCreateView(Activity.java:4908)
  32. 08-06 22:17:12.537: E/AndroidRuntime(3751):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:686)
  33. 08-06 22:17:12.537: E/AndroidRuntime(3751):     ... 21 more
  34. 08-06 22:17:12.537: E/AndroidRuntime(3751): Caused by: java.lang.ClassCastException
  35. 08-06 22:17:12.537: E/AndroidRuntime(3751):     ... 25 more

(2) ListView 适配器设置错误

ListView 适配器引用的 组件, 必须是已经加载过的, 通过 onCreate()中的 setContentView()方法加载, 或者通过 LayoutInflater 进行加载;

错误 :

[plain] view
plain
copy

  1. 08-06 22:39:22.139: W/dalvikvm(4413): threadid=1: thread exiting with uncaught exception (group=0x40dc0930)
  2. 08-06 22:39:22.139: E/AndroidRuntime(4413): FATAL EXCEPTION: main
  3. 08-06 22:39:22.139: E/AndroidRuntime(4413): android.content.res.Resources$NotFoundException: Resource ID #0x7f080001 type #0x12 is not valid
  4. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.content.res.Resources.loadXmlResourceParser(Resources.java:3033)
  5. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.content.res.Resources.getLayout(Resources.java:1722)
  6. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.view.LayoutInflater.inflate(LayoutInflater.java:395)
  7. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:371)
  8. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
  9. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.widget.AbsListView.obtainView(AbsListView.java:2603)
  10. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.widget.ListView.makeAndAddView(ListView.java:1840)
  11. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.widget.ListView.fillDown(ListView.java:681)
  12. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.widget.ListView.fillFromTop(ListView.java:742)
  13. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.widget.ListView.layoutChildren(ListView.java:1661)
  14. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.widget.AbsListView.onLayout(AbsListView.java:2426)
  15. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.view.View.layout(View.java:14905)
  16. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.view.ViewGroup.layout(ViewGroup.java:4601)
  17. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
  18. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.view.View.layout(View.java:14905)
  19. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.view.ViewGroup.layout(ViewGroup.java:4601)
  20. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
  21. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.view.View.layout(View.java:14905)
  22. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.view.ViewGroup.layout(ViewGroup.java:4601)
  23. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1021)
  24. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.view.View.layout(View.java:14905)
  25. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.view.ViewGroup.layout(ViewGroup.java:4601)
  26. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
  27. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.view.View.layout(View.java:14905)
  28. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.view.ViewGroup.layout(ViewGroup.java:4601)
  29. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1694)
  30. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1552)
  31. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.widget.LinearLayout.onLayout(LinearLayout.java:1465)
  32. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.view.View.layout(View.java:14905)
  33. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.view.ViewGroup.layout(ViewGroup.java:4601)
  34. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
  35. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.view.View.layout(View.java:14905)
  36. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.view.ViewGroup.layout(ViewGroup.java:4601)
  37. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2213)
  38. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2027)
  39. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1237)
  40. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5162)
  41. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:791)
  42. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.view.Choreographer.doCallbacks(Choreographer.java:591)
  43. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.view.Choreographer.doFrame(Choreographer.java:561)
  44. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:777)
  45. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.os.Handler.handleCallback(Handler.java:725)
  46. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.os.Handler.dispatchMessage(Handler.java:92)
  47. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.os.Looper.loop(Looper.java:176)
  48. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at android.app.ActivityThread.main(ActivityThread.java:5319)
  49. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at java.lang.reflect.Method.invokeNative(Native Method)
  50. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at java.lang.reflect.Method.invoke(Method.java:511)
  51. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
  52. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
  53. 08-06 22:39:22.139: E/AndroidRuntime(4413):     at dalvik.system.NativeStart.main(Native Method)

9. Fragement 复用问题

需求 : 在手机竖屏的时候, 新闻列表 和 新闻内容 在两个 Activity 中, 横屏的时候, 在一个 Activity 中;

(1) 根据不同的环境加载不同的布局

定义实际引用的资源 : 在 Java 代码中引用资源的时候, 会到 values 中查询, 是否有定义资源文件, 如果有, 优先按照该定义加载指定资源文件;

-- 定义方式 : 下面的定义, 如果代码中引用 R.layout.activity_main, 符合条件的话, 使用 R.layout.activity_main_land 布局文件;

[html] view
plain
copy

  1. <resources>
  2. <item type="layout" name="activity_main">@layout/activity_main_land</item>
  3. </resources>

-- 属性说明 :
type 资源的类型, name 资源名称;

(2) 判断加载的布局文件

判断的依据 : 根据 两个布局文件的差异, 任意查找一个组件, 或者定义一个 不占位置的组件, 来进行判定;

[java] view
plain
copy

  1. /* 查看加载的是哪个文件, 如果文件中包含 R.id.news_content_content 组件, 就说明现在是横屏的 */
  2. isLand = findViewById(R.id.news_content) != null;

(3) MainActivity 代码差异

[java] view
plain
copy

  1. package cn.org.octopus;
  2. import android.app.Activity;
  3. import android.app.FragmentManager;
  4. import android.app.FragmentTransaction;
  5. import android.content.Intent;
  6. import android.os.Bundle;
  7. import cn.org.octopus.NewsTittleFragment.Callbacks;
  8. public class MainActivity extends Activity implements Callbacks {
  9. private boolean isLand;     /* 标识是否是横屏 */
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. /* 加载布局文件, 这个布局文件中有一个 Fragment, 会自动加载该 Fragmet */
  14. setContentView(R.layout.activity_main);
  15. /* 查看加载的是哪个文件, 如果文件中包含 R.id.news_content_content 组件, 就说明现在是横屏的 */
  16. isLand = findViewById(R.id.news_content) != null;
  17. }
  18. /**
  19. * 实现的 Callbasks 接口的方法,
  20. * 当 NewsTittleFragement 中的 ListView 被点击的时候 回调
  21. * */
  22. @Override
  23. public void onNewsSelect(int id) {
  24. /* 如果是横屏的情况, 两个 Fragement 都在一个界面中  */
  25. if(isLand){
  26. /* 创建 Bundle 对象, Activity 传递给 Fragment 的参数需要靠该对象进行传递 */
  27. Bundle arguments = new Bundle();
  28. /* 封装数据到 Bundle 对象中, 注意提前定义好键值 */
  29. arguments.putInt(NewsContentFragement.TAG_NEWS_ID, id);
  30. /* 创建 Fragment 对象 */
  31. NewsContentFragement fragement = new NewsContentFragement();
  32. /* 将 Activity 要传递的数据 传递给 Fragment 对象 */
  33. fragement.setArguments(arguments);
  34. /* 获取FragmentManager 对象 */
  35. FragmentManager manager = getFragmentManager();
  36. /* 开启事务, 获取事务 */
  37. FragmentTransaction transaction =  manager.beginTransaction();
  38. /* 在事务中进行替换操作 */
  39. transaction.replace(R.id.news_content, fragement);
  40. /* 提交操作 */
  41. transaction.commit();
  42. }else{  /* 竖屏的情况, 需要开启 Activity */
  43. System.out.println("isLand : " + isLand);
  44. Intent intent = new Intent(getApplicationContext(), NewsContentActivity.class);
  45. /* 通过 Intent 的 Bundle 对象传递参数 */
  46. intent.putExtra(NewsContentFragement.TAG_NEWS_ID, id);
  47. startActivity(intent);
  48. }
  49. }
  50. }

(4) 新增了 NewsContentActivity

[java] view
plain
copy

  1. package cn.org.octopus;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. public class NewsContentActivity extends Activity {
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. /* 设置布局文件 */
  9. setContentView(R.layout.activity_news_content);
  10. /* 创建 Fragement */
  11. NewsContentFragement fragement = new NewsContentFragement();
  12. /* 创建绑定的数据 */
  13. Bundle bundle = new Bundle();
  14. /* 从Activity 获取 启动该 Activity 的 Intent */
  15. int id = getIntent().getIntExtra(NewsContentFragement.TAG_NEWS_ID, 0);
  16. bundle.putInt(NewsContentFragement.TAG_NEWS_ID, id);
  17. /* 设置数据给 Fragment */
  18. fragement.setArguments(bundle);
  19. /* 开启事务 操作 Fragement 并提交 */
  20. getFragmentManager().beginTransaction().add(R.id.news_content, fragement).commit();
  21. }
  22. }

(5) 新增 或 修改的布局文件

activity_main.xml :

[html] view
plain
copy

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:paddingBottom="@dimen/activity_vertical_margin"
  6. android:paddingLeft="@dimen/activity_horizontal_margin"
  7. android:paddingRight="@dimen/activity_horizontal_margin"
  8. android:paddingTop="@dimen/activity_vertical_margin"
  9. tools:context=".MainActivity" >
  10. <fragment
  11. android:id="@+id/tittle_fragment"
  12. android:name="cn.org.octopus.NewsTittleFragment"
  13. android:layout_width="0dp"
  14. android:layout_weight="1"
  15. android:layout_height="match_parent"/>
  16. </LinearLayout>

activity_main_land.xml :

[html] view
plain
copy

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:paddingBottom="@dimen/activity_vertical_margin"
  6. android:paddingLeft="@dimen/activity_horizontal_margin"
  7. android:paddingRight="@dimen/activity_horizontal_margin"
  8. android:paddingTop="@dimen/activity_vertical_margin"
  9. tools:context=".MainActivity"
  10. android:orientation="horizontal"
  11. android:divider="?android:attr/dividerHorizontal"
  12. android:showDividers="middle">
  13. <!--
  14. 资源引用方式解析 :
  15. @+id : 定义一个 id 值, 用于识别组件
  16. @id : 引用 id 值代表的组件
  17. @anroid:type : 引用 Android 内部的资源, type 指的是 drawable string 等资源类型
  18. ?android:attr : 引用 Android 内部的样式
  19. 分割线解析 :
  20. 分割线资源 : 在 android:divider 属性中引入样式, 这里通过 ?android:attr 引入一个 android 的自定义样式
  21. 分割线样式 : android:showDivider 属性中设置, none 不显示分割线, beginning 在开始处显示, end 在结尾显示, middle 中间显示
  22. -->
  23. <fragment
  24. android:id="@+id/tittle_fragment"
  25. android:name="cn.org.octopus.NewsTittleFragment"
  26. android:layout_width="0dp"
  27. android:layout_weight="1"
  28. android:layout_height="match_parent"/>
  29. <FrameLayout
  30. android:id="@+id/news_content"
  31. android:layout_width="0dp"
  32. android:layout_weight="3"
  33. android:layout_height="match_parent"/>
  34. </LinearLayout>

activity_news_content.xml :

[html] view
plain
copy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@+id/news_content"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:orientation="vertical" />

(6) 执行效果

竖屏 :

横屏 :

作者 : 韩曙亮

转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/38064191

Android 开发 之 Fragment 详解的更多相关文章

  1. Android开发–Intent-filter属性详解

    Android开发–Intent-filter属性详解 2011年05月09日 ⁄ Andriod ⁄ 暂无评论 ⁄ 被围观 1,396 views+ 如果一个 Intent 请求在一片数据上执行一个 ...

  2. 搭建Android开发环境附图详解+模拟器安装(JDK+Eclipse+SDK+ADT)

    ——搭建android开发环境的方式有多种,比如:JDK+Eclipse+SDK+ADT或者JDK+Eclipse+捆绑好的AndroidSDK或者Android Studio. Google 决定将 ...

  3. android 开发 View _6_Canvas详解

    牛逼大神的博客地址:http://www.gcssloop.com/customview/Canvas_BasicGraphics 安卓自定义View进阶-Canvas之绘制图形 在上一篇自定义Vie ...

  4. 【Android 应用开发】 Fragment 详解

    作者 : 韩曙亮 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/38064191 本博客代码地址 : -- 单一 Fragmen ...

  5. 【Android基础】Fragment 详解之Fragment生命周期

    上一篇文章简单介绍了一下Fragment,这一篇文章会详细的说一下Fragment的生命周期和创建一个用户界面. Fragment的主要功能就是创建一个View,并且有一个生命周期来管理这个View的 ...

  6. 【Android基础】Fragment 详解之Fragment介绍

    Fragment在Android 3.0( API 11)引入,是为了支持在大屏上显示更加动态.灵活的UI,比如在平板和电视上.Fragment可以看作是嵌套的Activity,类似ActivityG ...

  7. 2-5 Flutter开发环境与Android开发环境设置详解(Windows)

    第二个是国内服务器的网址 andoid stuido的一些使用的说明文档 https://developer.android.google.cn/studio/intro 安装Flutter Dart ...

  8. Android开发 VideoView视频播放详解

    前言 VideoView是Android主要的视频播放View,它其实是对MediaPlayer的再次封装.如果你已经了解过MediaPlayer在使用VideoView是十分简单的.如果你想先了解M ...

  9. Android开发 DialogFragment对话框详解

    前言 在聊DialogFragment之前,我们看看以往我们在Android里实现一个对话框一般有这几种方式: Dialog 继承重写Dialog实现一个自定义的Dialog AlertDialog ...

随机推荐

  1. asp.net 代码 注意点

    1. 模糊查询时,注意要去掉空格 前台: <input id="txtQJBH" type="text" runat="server" ...

  2. 解决uploadify多图片上传部分图片丢失,且不提示任何错误的问题

    这两天用到uploadify的flash版本进行批量图片上传并生成缩略图的功能,之前用uploadify用的好好的,这次突然出现了一个奇怪的问题. 问题描述如下:当我选择单个图片上传的时候,图片上传都 ...

  3. 100个iOS开发/设计面试题汇总

    常见问题 你昨天/这周学习了什么? 你为什么热衷于软件开发? 你对哪一种控制系统比较熟悉? 是否参与过GitHub项目? 是否参与过GitHub或其他同类型网站的iOS开源项目? 请描述一下你的iOS ...

  4. Visual Studio 2013 如何关闭调试而不关闭IIS Express

    在VS主面板打开:工具->选项->调试->编辑继续   取消选中[启用"编辑并继续"] 就OK了 (英文版的请对应相应的操作) 不过这是针对所有的调试,如果你想针 ...

  5. 登陆sqlserver及修改端口号 (转)

    在一台计算机上面同时安装两个sql server数据库实例,第一次安装默认为机器名,端口号为1433 1.如果不知道服务器名,却想登陆的话可以直接输入127.0.0.1登陆之后,在新建查询中输入:SE ...

  6. php大力力 [035节] 先记录一些链接

    [IT名人堂]专访百分点研发总监:不止于平台,大数据操作系统重磅来袭! [2015-8-11 14:17:04] [IT名人堂]专访1号店技术总监:大型电商网站的IT架构 [2015-8-25 15: ...

  7. 在config文件输入特殊字符

    今天遇到要在config文件中配置一个包含引号,尖括号的特殊字符的问题,config文件不支持转义字符,我开始发动自己的脑子想,想出一个蹩脚的方法,用其他的字符替换比如&,?,!,问题倒是解决 ...

  8. iOS LaunchScreen启动图设置

    新建的iOS 项目启动画面默认为LaunchScreen.xib 如果想实现一张图片作为启动页,如下图 如果启动不行  记得clear 一下工程 是启动页停留一段时间  只需要在 AppDelegat ...

  9. Best Sequence_DFS&&KMp

    Description The twenty-first century is a biology-technology developing century. One of the most att ...

  10. Android白天/夜间模式Day/Night Mode标准原生SDK实现

     Android白天/夜间模式Day/Night Mode标准原生SDK实现 章节A:Android实现白天/夜间模式主要控制器在于UiModeManager,UiModeManager是Andr ...