zoukankan      html  css  js  c++  java
  • Fragment 总结

    本博客代码地址 : 

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

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

    Fragment 总结 

    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 plaincopy在CODE上查看代码片派生到我的代码片
     
    1. onCreate(Bundle savedInstanceState)  

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

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

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

    onCreateView() : 

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState);  

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

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

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

    onPause() : 

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

    3. Fragment 创建

    Fragment 创建 : 

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

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. Bundle bundle = new Bundle();   
    2. bundle.putString("key", "value");  

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

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

    (3) 新闻内容的 Fragment

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

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

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

    新闻实体类 : 

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. package cn.org.octopus;  
    2.   
    3. public class News {  
    4.   
    5.     private int id;         //新闻序号  
    6.     private String tittle;  //新闻标题  
    7.     private String content; //新闻内容  
    8.   
    9.     /** 构造方法  */  
    10.     public News(int id, String tittle, String content) {  
    11.         super();  
    12.         this.id = id;  
    13.         this.tittle = tittle;  
    14.         this.content = content;  
    15.     }  
    16.   
    17.     public int getId() {  
    18.         return id;  
    19.     }  
    20.   
    21.     public void setId(int id) {  
    22.         this.id = id;  
    23.     }  
    24.   
    25.     public String getTittle() {  
    26.         return tittle;  
    27.     }  
    28.   
    29.     public void setTittle(String tittle) {  
    30.         this.tittle = tittle;  
    31.     }  
    32.   
    33.     public String getContent() {  
    34.         return content;  
    35.     }  
    36.   
    37.     public void setContent(String content) {  
    38.         this.content = content;  
    39.     }  
    40.   
    41.     /* 这里只返回标题, 是为了适配 ListFragement 时使用 */  
    42.     @Override  
    43.     public String toString() {  
    44. //      return "News [id=" + id + ", tittle=" + tittle + ", content=" + content  
    45. //              + "]";  
    46.         return tittle;  
    47.     }  
    48.       
    49. }  



    新闻数据 : 

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




    (5) 主界面 Actiity 代码

    主界面代码 : MainActivity.java

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



    (6) AndroidManifest.xml 配置文件

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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.   
    7.     <uses-sdk  
    8.         android:minSdkVersion="15"  
    9.         android:targetSdkVersion="19" />  
    10.   
    11.     <application  
    12.         android:allowBackup="true"  
    13.         android:icon="@drawable/ic_launcher"  
    14.         android:label="@string/app_name"  
    15.         android:theme="@style/AppTheme" >  
    16.           
    17.         <!--   
    18.             设置屏幕方向 android:screenOrientation :   
    19.                 unspecified : 默认值, 系统自动判定方向  
    20.                 landscape : 横屏显示  
    21.                 portrait : 竖屏显示  
    22.                 user : 用户当前首选方向  
    23.                 behind : 与 之前的 Activity 方向一致;  
    24.                 sensor : 由物理传感器决定  
    25.                 nosenser : 忽略物理传感器感应  
    26.          -->  
    27.           
    28.         <activity  
    29.             android:name="cn.org.octopus.MainActivity"  
    30.             android:label="@string/app_name"   
    31.             android:screenOrientation="landscape">  
    32.             <intent-filter>  
    33.                 <action android:name="android.intent.action.MAIN" />  
    34.   
    35.                 <category android:name="android.intent.category.LAUNCHER" />  
    36.             </intent-filter>  
    37.         </activity>  
    38.     </application>  
    39.   
    40. </manifest>  



    (7) 执行结果

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

    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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 plaincopy在CODE上查看代码片派生到我的代码片
     
    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 plaincopy在CODE上查看代码片派生到我的代码片
     
    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 plaincopy在CODE上查看代码片派生到我的代码片
     
    1. <resources>  
    2.     <item type="layout" name="activity_main">@layout/activity_main_land</item>  
    3. </resources>  

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

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

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

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. /* 查看加载的是哪个文件, 如果文件中包含 R.id.news_content_content 组件, 就说明现在是横屏的 */  
    2. isLand = findViewById(R.id.news_content) != null;  



    (3) MainActivity 代码差异

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



    (4) 新增了 NewsContentActivity 

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



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

    activity_main.xml : 

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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.   
    11.     <fragment   
    12.         android:id="@+id/tittle_fragment"  
    13.         android:name="cn.org.octopus.NewsTittleFragment"  
    14.         android:layout_width="0dp"  
    15.         android:layout_weight="1"  
    16.         android:layout_height="match_parent"/>  
    17.   
    18. </LinearLayout>  



    activity_main_land.xml : 

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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.         资源引用方式解析 :    
    16.             @+id : 定义一个 id 值, 用于识别组件  
    17.             @id : 引用 id 值代表的组件  
    18.             @anroid:type : 引用 Android 内部的资源, type 指的是 drawable string 等资源类型  
    19.             ?android:attr : 引用 Android 内部的样式  
    20.           
    21.         分割线解析 :   
    22.             分割线资源 : 在 android:divider 属性中引入样式, 这里通过 ?android:attr 引入一个 android 的自定义样式  
    23.             分割线样式 : android:showDivider 属性中设置, none 不显示分割线, beginning 在开始处显示, end 在结尾显示, middle 中间显示  
    24.      -->  
    25.   
    26.     <fragment   
    27.         android:id="@+id/tittle_fragment"  
    28.         android:name="cn.org.octopus.NewsTittleFragment"  
    29.         android:layout_width="0dp"  
    30.         android:layout_weight="1"  
    31.         android:layout_height="match_parent"/>  
    32.       
    33.     <FrameLayout   
    34.         android:id="@+id/news_content"  
    35.         android:layout_width="0dp"  
    36.         android:layout_weight="3"  
    37.         android:layout_height="match_parent"/>  
    38.   
    39. </LinearLayout>  



    activity_news_content.xml : 

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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

  • 相关阅读:
    软件命名规则
    从命令行git转到Tortoise
    如何让浏览器不解析html?
    说几点我觉得谷歌浏览器不好的地方
    移动端开发:使用jQuery Mobile还是Zepto
    开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别
    给大家讲个故事,感受一下什么叫CF。不知道的请认真听。
    cmd中utf-8编码的问题
    web前端关于html转义符的常用js函数
    js实例分析JavaScript中的事件委托和事件绑定
  • 原文地址:https://www.cnblogs.com/WangZhiFighting/p/4900668.html
Copyright © 2011-2022 走看看