1. 程式人生 > >Android Fragment 詳解 2016 乾貨

Android Fragment 詳解 2016 乾貨

最近看了很多動畫和一些效果很好的自定義控制元件,發現了一件事,就是Android的View層設計思想和古老的JavaSwing是如此的相似。這是在原來的基礎上加入了一些輸入移動端的生命週期,使其在使用和效能上更好。但是對核心的理解還是可以借鑑一些的。
如果說Activity就是JavaSwing的JFrame那麼Fragment 就是在JPanel
一個是容器頂層控制元件,一個是顯示在容器上的中間層控制元件。
所以這裡插一句話,如果感覺自己android寫的不溜那麼就多看看java的程式碼。和設計思想吧。android的東西太多都是繼承自java或者說就是java的衍生品。無論是頂層容器還是底層容器都是為了放互動容器的。

Fragment的使用
一、佈局
大家完全可以把Fragment看成一個輕量級的Activity.為什麼輕量,因為他不用在mainfest.xml檔案中新增自己.第二他不能直接啟動,必須依附(attach)在activity之上。
所以在這佈局這一塊,Fragment的使用完全可以和activity的佈局劃等號,設計圖怎麼畫在這裡就怎麼設計一個 Fragment .

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"
android:layout_height="match_parent" android:background="#00ff00" >
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="This is fragment 1" android:textColor="#000000" android:textSize="25sp"
/>
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:background="#ffff00" >  

    <TextView  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="This is fragment 2"  
        android:textColor="#000000"  
        android:textSize="25sp" />  

</LinearLayout>  

簡單的畫了兩個佈局背景不同,文字區分1和2
二、在Activity中使用
使用方法一:靜態載入一個Fragment
第一步把這個 fragment例項化

public class Fragment1 extends Fragment {  

    @Override  
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
        return inflater.inflate(R.layout.fragment1, container, false);  
    }  
}  

二和一 ,一樣
在onCreateView() 中實現的是

{
    View view=inflater.inflate(R.layout.fragment);//這個View就是父容器在這個佈局裡的其他控制元件 好比TextView要依靠他findViewById();
    TextView tv=(TextView)view.findViewById(R.id,textview);
    return view;
}

這樣一個 Fragment在View層就建立成功了。
然後開啟或新建activity_main.xml作為主Activity的佈局檔案,在裡面加入兩個Fragment的引用,使用android:name字首來引用具體的

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:baselineAligned="false" >  

    <fragment  
        android:id="@+id/fragment1"  
        **android:name="com.example.fragmentdemo.Fragment1"**  
        android:layout_width="0dip"  
        android:layout_height="match_parent"  
        android:layout_weight="1" />  

    <fragment  
        android:id="@+id/fragment2"  
        **android:name="com.example.fragmentdemo.Fragment2"**  
        android:layout_width="0dip"  
        android:layout_height="match_parent"  
        android:layout_weight="1" />  

</LinearLayout>  

最後開啟或新建MainActivity作為程式的主Activity,裡面的程式碼非常簡單,都是自動生成的:

public class MainActivity extends Activity {  

    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
    }  

}  

這裡寫圖片描述
如我們的設計一樣,兩個Fragment平分了螢幕

使用方法二:動態新增
這回我們直接在Activity中使用Fragment

public class MainActivity extends Activity {  

    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        Display display = getWindowManager().getDefaultDisplay();  
        if (display.getWidth() > display.getHeight()) {  
            Fragment1 fragment1 = new Fragment1(); //新建Fragment
            getFragmentManager().beginTransaction().replace(R.id.main_layout, fragment1).commit(); //新增Fragment提交
        } else {  
            Fragment2 fragment2 = new Fragment2();  
            getFragmentManager().beginTransaction().replace(R.id.main_layout, fragment2).commit();  
        }  
    }   
}  

首先,我們要獲取螢幕的寬度和高度,然後進行判斷,如果螢幕寬度大於高度就新增fragment1,如果高度大於寬度就新增fragment2。動態新增Fragment主要分為4步:
1.獲取到FragmentManager,在Activity中可以直接通過getFragmentManager得到。
2.開啟一個事務,通過呼叫beginTransaction方法開啟。
3.向容器內加入Fragment,一般使用replace方法實現,需要傳入容器的id和Fragment的例項。
4.提交事務,呼叫commit方法提交。
現在執行一下程式,效果如下圖所示:
豎屏顯示結果
這裡寫圖片描述`
橫屏顯示結果
這裡寫圖片描述

在實戰中主要使用的是第二種方法使用我們的Fragment.
這裡寫圖片描述
即底部是三個activity切換按鈕上面是三個Fragment這裡的,這裡對Fragment的使用方法就是使用動態載入的方法。

三、Fragment的生命週期 Fragment 就是一個輕量的Activity那麼他的宣告週期就和Activity非常像了。
生命週期如下:
1.onAttach() 在Fragment和Activity建立關聯的時候呼叫
2.onCreate() 初始化Fragment本身為inflate view做準備
3.onCreateView() 對佈局中的所有控制元件進行初始化 繫結
4.onActivityCreated
5.onStart
6onResume
在按下home之後
1.onPause 程式掛起
2.onStop 當前activity 停止
在返回程式之後
1.onStart 開始
2.onResume 恢復

點選back退出程式
1onPause
2onStop
3onDestoryView Fragment 的View被移除了。
4onDestory
5onDetach Fragment和Activiy解除關聯的時候呼叫
注:此處並沒有onRestart()方法!

三、Fragment通訊
這裡的通訊主要分為
fragment->fragment 通過getActivity()為橋樑進行通訊
Activity->fragment
fragment-activity 最簡單 所有activity 之間的通訊方法這種時候都可以用

如在之前Fragment2中新增一個button那麼我們需要呼叫其他相關的Fragment是如何實現的那。

public class Fragment2 extends Fragment {  

    @Override  
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
        return inflater.inflate(R.layout.fragment2, container, false);  
    }  

    @Override  
    public void onActivityCreated(Bundle savedInstanceState) {  
        super.onActivityCreated(savedInstanceState);  
        Button button = (Button) getActivity().findViewById(R.id.button);  
        button.setOnClickListener(new OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                TextView textView = (TextView) getActivity().findViewById(R.id.fragment1_text);  
                Toast.makeText(getActivity(), textView.getText(), Toast.LENGTH_LONG).show();  
            }  
        });  
    }    
}  

當點選按鈕的時候就會在Toast中顯示Fragment1中的內容。
當然兩個Fragment需要使用一個共同的activity父容器。

最後分享一些使用心得
補充知識點:
1、什麼是FragmentTransaction?
使用Fragment時,可以通過使用者互動來執行一些動作,比如增加、移除、替換等。
所有這些改變構成一個集合,這個集合被叫做一個transaction。

可以呼叫FragmentTransaction中的方法來處理這個transaction,並且可以將transaction存進由activity管理的back stack中,這樣使用者就可以進行fragment變化的回退操作。

可以這樣得到FragmentTransaction類的例項:

1.FragmentManager  mFragmentManager = getSupportFragmentManager();
2.FragmentTransaction  mFragmentTransaction = mFragmentManager.beginTransaction();

在多個 Fragment 之間進行切換的時候
replace()和hide的區別
首先replace 是代替,之前的Fragment會被清空掉,在再次切換回來的時候會進行重新載入。而hide是將之前的一個fragment 進行隱藏,將新的fragment 疊在上面進行顯示.等在次呼叫的時候進行顯示。不需要重新載入。測試這個最簡單的方法就是 設計兩個fragment 在同一位置上放一個按鈕,一個有監聽一個沒有,但現實沒有監聽的按鈕點選按鈕的時候會響應一號按鈕的監聽事件。

另外一個對於 FragmentTransaction物件在commit之後就會失效。所以建議直接使用fragmentManager.beginTransaction() 這樣就不會產生失效的問題了。

commit 於commitAllowingStateLoss();的區別
簡單來說就是避免報錯。
他們都呼叫了commitInternal
public int commit() {
return commitInternal(false);
}

public int commitAllowingStateLoss() {
return commitInternal(true);
}
這個兩個方法區別就在傳參判斷後的處理方法checkStateLoss
當使用commit方法時,系統將進行狀態判斷,如果狀態(mStateSaved)已經儲存,將發生”Can not perform this action after onSaveInstanceState”錯誤。
如果mNoTransactionsBecause已經存在,將發生”Can not perform this action inside of ” + mNoTransactionsBecause錯誤

相關推薦

Android Fragment 2016 乾貨

最近看了很多動畫和一些效果很好的自定義控制元件,發現了一件事,就是Android的View層設計思想和古老的JavaSwing是如此的相似。這是在原來的基礎上加入了一些輸入移動端的生命週期,使其在使用和效能上更好。但是對核心的理解還是可以借鑑一些的。 如果說A

Android Gradle 2016 乾貨

為啥要說Gradle,因為這哥們是在是個坑啊,而且還是繞不開的坑啊。 就像我,上來就一心想著幹程式碼,完成專案,但是往往有的時候就會掉到這個坑裡而無法自拔。實在是恨死了啊。說多了都是眼淚,那麼直接上圖,從簡到難,深入淺出的來了解一下Gradle到底是個什麼東西

Android Fragment

Fragment產生原因: 同時適配手機和平板、UI和邏輯的共享。 介紹: Fragment也會被加入回退棧中。Fragment擁有自己的生命週期和接受、處理使用者的事件。可以動態的新增、替換和移除某個Fragment。必須依存於Activity生命週期 Fragmen

Android Fragment(五):Fragment與Activity通訊

與activity通訊儘管fragment的實現是獨立於activity的,可以被用於多個activity,但是每個activity所包含的是同一個fragment的不同的例項。Fragment可以呼叫getActivity()方法很容易的得到它所在的activity的物件,

2016 Android 動畫 乾貨(一)

本系列文章會借鑑一些前輩的經典帖子。這裡對這些巨人表示感謝。 在最後我會放出一些根據這些動畫實現的小遊戲,以及原碼,不足的地方歡迎切磋。 Android的動畫一開始分為兩種方式實現 第一種就是:逐幀動畫 實現原理很簡單就是將一個完整的動畫拆分成一張張單獨的

Android UIFragment例項

http://blog.csdn.net/eclipsexys/article/details/8708024 上一篇我們講解了Fragment的載入方式,這次我們以一個例項來講解: 佈局: <LinearLayoutxmlns:android="htt

Android進階——Fragment之操作原理(三)

引言 前一篇文章總結了Fragment 的基本概念和基本的用法,相信大家也能夠掌握一些知識了,但是對於一些操作可能還是不知其所以然,說實話曾經很長一段時間為也是暈乎乎的,後來才慢慢重視去學習瞭解,才略知一二,遂分享之。 一、管理Fragement所涉及到

android Fragments二:建立Fragment

建立Fragment     要建立fragment,必須從Fragment或Fragment的派生類派生出一個類。Fragment的程式碼寫起來有些像activity。它具有跟activity一樣的回撥方法,比如 onCreate(),onStart(),onPa

Android入門——Fragment之基本概念與用法(一)

引言 Android在3.0中引入了Fragments的概念,其目的是用在大螢幕裝置上–例如平板電腦上,支援更加動態和靈活的UI設計。平板電腦的螢幕要比手機的大得多,有更多的空間來放更多的UI元件,並且這些元件之間會產生更多的互動。Fragment允許這樣的一

android -------- WIFI

mov 取ip地址 fico alt b- else if 無線網 pan PC 今天簡單的來聊一下安卓開發中的Wifi,一些常用的基礎,主要分為兩部分: 1:WiFi的信息 2:WiFi的搜索和連接 現在app大多都需要從網絡上獲得數據。所以訪問網絡是在

Android Permission

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android ViewModel

1. ViewModel概述 2. 實現一個ViewModel 3. ViewModel的生命週期 4. 在fragments之間共享資料 5. ViewModel替換Loaders 6. 附加資源 1.

Android LiveData

官方文件翻譯 1.LiveData概述 1.1 使用LiveData的優點 1.2 使用LiveData物件 1.2.1 建立LiveData物件 1.2.2 觀察LiveData物件

Android Lifecycle(一)

官方文件翻譯 使用生命週期感知元件處理生命週期 Lifecycle Event State LifecycleOwner 實現一個自定義的LifecycleOwner 生命週期感

Android Animation

關於動畫的實現,Android提供了Animation,在Android SDK介紹了2種Animation模式: 1. Tween Animation:通過對場景裡的物件不斷做影象變換(平移、縮放、旋轉)產生動畫效果,即是一種漸變動畫; 2. Frame Animation:

Android開發之onTouch和onClick

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android UI之顏色資源的使用

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android開發--ContentProvider/Cursor的使用

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android Activity

生命週期 如上圖所示,Activity生命週期很簡單共七個生命週期函式,oncreate(),onrestart(),onstart(),onresume(),onpause(),onstop(),ondestroy(); 下面舉兩個例子來說明Activity生命週期函式呼叫關係。

Android Handler

Handler適用於執行緒間互動的一種機制。牽扯到四個類:Handler,Looper,MessageQueue,Message。 這四個類關係如下圖所示: 這個圖自己畫的,比較簡易,但是很能說明他們的關係 Handler:用於執行緒之間傳送訊息,一般Handler在主執行緒中被建