是的,你沒有看錯,是(五),你也不用再找了,這裏沒有一二三四,直接就是五啦,由於一二三四在這裏。。。很久沒寫安卓的博客了,以前定好的要在2016年前寫完這個系列的目標也是失敗了,但文章總得要寫,這篇就是關於fragment的簡單使用。html
fragment的意思就是碎片,是一種能夠嵌入在activity中的UI片斷,能夠最大化的利用手機的屏幕。如今不少應用都使用了fragment,最多見的就是微信了,微信下面的tab欄切換時,上面的內容就是用fragment來顯示的。看看看,這麼牛的微信都在用fragment,咱們趕忙來用他吧。android
啥,又是生命週期,他又不是activity,怎麼還有生命週期呢。是的,fragment依託於activity而存在,他是有生命週期的,並且他的生命週期的理解最好仍是和activity一塊兒比較更容易理解。在說明他的生命週期以前,咱們先來實現一個簡單的fragment的例子。微信
咱們先來寫兩個簡單的fragment,而後在MainActivity點擊按鍵來切換這兩個fragment。ide
第一個fragment佈局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:gravity="center" android:background="@android:color/holo_blue_light" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:text="第一個Fragment" android:textSize="25sp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
第二個fragment學習
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:gravity="center" android:background="@android:color/holo_red_light" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:text="第二個Fragment" android:textSize="25sp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
能夠看到這兩個佈局都很是簡單,只是單純的設置了背景色以及一個TextView。
而後實現這兩個fragment,新建兩個類FirstFragment和SecondFragment都繼承Fragment,並將佈局文件和類進行綁定。
FristFragment:ui
public class FirstFragment extends Fragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.first_fragment,null); return view; } }
SecordFragment:spa
public class SecondFragment extends Fragment{ @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.second_fragment,null); return view; } }
接下來是MainActivity的佈局.net
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_marginTop="10dp" android:gravity="center" android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:gravity="center" android:id="@+id/btn_change" android:text="Change" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> <FrameLayout android:id="@+id/framelayout" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:id="@+id/fragment" android:name="com.example.jiang.fragmenttest.FirstFragment" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout> </LinearLayout>
這裏使用了FrameLayout,他的特性就是會從左上角層疊佈局。默認顯示的是FirstFragmentcode
接下來看MainActivity的內容,給button添加了點擊事件:
public class MainActivity extends AppCompatActivity { private Button btn_change; private SecondFragment secondFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn_change = (Button) findViewById(R.id.btn_change); btn_change.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { secondFragment = new SecondFragment(); FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.replace(R.id.framelayout,secondFragment); transaction.commit(); } }); } }
這樣就能夠實現點擊切換fragment的效果,先看效果圖:
這裏咱們能夠看到點擊按鍵後界面就進行切換了,這裏一個動態的fragment的切換主要是如下五個步驟:
建立一個fragment實例,
獲取FragmentManager,在activity中能夠直接調用getFragmentManager()
來獲取,
開啓一個事務,經過beginTransaction()
來開啓,
向容器添加fragment,通常採用replace()
來切換,須要傳入容器的id以及要替換的fragment實例,
提交事務,使用commit()
方法。
這樣就是能夠動態的切換一個fragment。這裏咱們發如今咱們切換了fragment後再按下返回鍵,程序居然不是返回到第一個fragment而是直接退出了。這樣很不符合咱們的操做習慣。這裏咱們就能夠把事務加入到返回棧中。修改MainActivity中的代碼,我這裏就不貼全了。
transaction.replace(R.id.framelayout,secondFragment); transaction.addToBackStack(null); transaction.commit();
從新編譯一次,就發現當按下返回鍵時就返回到了第一個fragment了。這裏就不貼圖了。
這只是一個最簡單的例子,咱們就來參照這個例子來看一下fragment的生命週期。fragment是依託於activity的,那麼他的生命週期就與activity息息相關,咱們先來看看官網fragment講解上的一張圖片。
先不着急說明,先到代碼中將生命週期打印出來。打開程序:
FirstFragment首次加載,生命週期是onAttach()
-->onCreate()
-->onCreateView()
-->onActivityCreated()
-->onStart()
-->onResume
。
而後咱們點擊button去切換到SecondFragment:
咱們看到FirstFragment先執行onPause()
-->onStop()
-->onDestoryView()
。而後SecondFragment再執行。咱們再按返回鍵返回到FirstFragment:
看這裏SecondFragment在執行完onDestoryView()
後又執行了onDestory()
-->onDetach()
。FirstFragment則直接從onActivityCreated()
開始執行。接着咱們再按返回鍵退出程序:
這裏FirstFragment纔去執行onDestoryView()
等方法。咱們再看官網上的另外一張圖
這樣這張圖是否是更好理解了呢。這裏我沒有把activity的生命週期也加入打印,但願有條件的同窗本身去敲敲代碼,看看二者間的關係是否是像第一張圖那樣的。
這樣最簡單的一個fragment就寫完了,但這基本上沒有什麼實際意義,下一篇文章將會寫一個簡單的底部tab欄切換,使用viewpaper+fragment。
耽擱了這麼久才寫完這篇,目標也是沒有達到。這大半年間也是經歷了許多,工做,生活都是有了大的變化,有開心,也有失落。從新撿起未寫完的博客,每一個人都在拼搏,有時候看到些負能量的段子--「比我聰明的人還在努力,我他媽的努力還有什麼用」,微微一笑,是啊,這裏確實比我還優秀的人都比我還努力,我努力還有什麼用呢。安下心來,認清本身只是個普通人,不要總活在夢中,腳踏實地的幹活,學習。羅馬不是一天建成的,騰訊帝國不是一蹴而就的,誰沒有經歷過失敗呢。一步一步的走,一步一步的犯錯,一步一步的改正,一步一步的走向成功。路飛用了兩年來升級,我給本身三年時間來升級。北京升級之路。(吐槽:這最後一段老是廢話,還不連貫,整個思想都是亂的,你這叫我怎麼看(╯‵□′)╯︵┻━┻,再很差好寫文章我就取關啦,哼!)哈哈,大家是否是這麼想,要是我猜對了就果斷給我點波關注唄,會繼續寫android以及React-Native的文章。謝謝啦!
學習路漫漫,吾將上下而求索。