Android 開發 之 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 自帶的佈局, 在 sdk\platforms\android-10\data\res\layout 目錄下 
  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) 執行效果


豎屏 : 



橫屏 : 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章