關於Fragment你所需知道的一切

2021-03-02 郭霖

今天周三,來自老熟人 劉明淵 的文章,想必大家都懂了。來自官方的也是最全面的譯文資料,這裡有你想要了解的關於Fragment的一切。

劉明淵 的博客地址:http://blog.csdn.net/vanpersie_9987

Fragment 是 Android API 中的一個類,它代表Activity中的一部分界面;您可以在一個 Activity 界面中使用多個 Fragment,或者在多個 Activity 中重用某一個 Fragment。

本文將介紹 Fragment 的 定義、創建、添加、移除、生命周期 等,如需訪問官方原文,您可以點擊這個連結(大多數情況下你得藉助某些工具才可以訪問):

https://developer.android.com/guide/components/fragments.html

可以把 Fragment 想像成 Activity 中的一個模塊,它有自己的生命周期、可以接收輸入事件、可以在 Activity 運行時將 Fragment 動態添加和移除等。

Fragment 必須嵌入在 Activity 中才能生存,其生命周期也直接受宿主 Activity 的生命周期的影響。比如,若宿主 Activity 處於 pause 狀態,它所管轄的 Fragment 也將進入 pause 狀態。而當 Activity 處於 resume 狀態的時候,您可以獨立地控制每一個 Fragment,如添加或刪除等。

當執行一個 Fragment 事務時,也可以將該 Fragment 加入到一個由宿主 Activity 管轄的後退棧中,並由 Activity 記錄加入到後退棧的 Fragment 信息,按下後退鍵可以將 Fragment 從後退棧中一次彈出。

將 Fragment 添加至 Activity 的視圖布局中有兩種方式:一種是使用fragment標籤加入,Fragment的父視圖應是一個ViewGroup;另一種使用代碼動態加入,並將一個ViewGroup作為Fragment的容器。

在某些情況下,fragment並不作為Activity視圖展示的一部分,它可能只是用來作為非顯示性的功能。

Fragment 是 Android 3.0 (API level 11) 新加入的API,主要的設置目的是為了使UI在不同的屏幕上表現得更加靈活。由於平板比手機屏幕大的多,因此平板上可以呈現更多的內容,而 Fragment 可以實現同一視圖布局在不同大小的屏幕上顯示不同的效果,將 Fragment 加入到 Activity 的 Layout 中,可以在運行時動態替換 Fragment 並將 Fragment 保存至 Activity 管轄的後退棧中。

比如說,一個新聞應用程式運行在平板上時,一個 Activity 視圖界面可以裝載兩個 Fragment,其中左邊的 Fragment 用於顯示新聞的標題,而右邊的 Fragment 用於顯示相應的新聞內容;若將該應用運行在手機上,一個 Activity 視圖界面無法裝載兩個 Fragment,故將兩個 Fragment 分別裝載到兩個 Activity中,如下所示: 


為了創建Fragment,需要繼承一個 Fragment 類,並實現 Fragment 的生命周期回調方法,如 onCreate(), onStart(), onPause(), onStop() 等。事實上,若需要在一個應用中加入 Fragment,只需要將原來的 Activity 替換為 Fragment,並將 Activity 的生命周期回調方法簡單地改為 Fragment 的生命周期回調方法即可。

一般來說,在 Fragment 中應至少重寫這些生命周期方法:

onCreate()當創建 Fragment 實例時,系統回調的方法。在該方法中,需要對一些必要的組件進行初始化,以保證這個組件的實例在 Fragment 處於 pause或stop 狀態時仍然存在。

onCreateView():當第一次在 Fragment 上繪製UI時,系統回調的方法。該方法返回一個 View 對象,該對象表示 Fragment 的根視圖;若 Fragment 不需要展示視圖,則該方法可以返回 null

onPause():當用戶離開 Fragment 時回調的方法(並不意味著該 Fragment 被銷毀)。在該方法中,可以對 Fragment 的數據信息做一些持久化的保存工作,因為用戶可能不再返回這個 Fragment。

大多數情況下,需要重寫上述三個方法,有時還需要重寫其他生命周期方法,Fragment 的生命周期如下所示: 


為了方便起見,繼承下面這些特殊的Fragment可以簡化其初始化過程:

DialogFragment:可展示一個懸浮的對話框。使用該類創建的對話框可以很好地替換由 Activity 類中的方法創建的對話框,因為您可以像管理其他 Fragment 一樣管理 DialogFragment——它們都被壓入由宿主 Activity 管理的 Fragment 棧中,這可以很方便的找回已被壓入棧中的 Fragment。

ListFragment:可以展示一個內置的 AdapterView,該 AdapterView 由一個 Adapter 管理著,如 SimpleCursorAdapterListFragment 類似於 ListActivity,它提供了大量的用於管理 ListView 的方法,比如回調方法 onListItemClick(),它用於處理點擊項事件。

PreferenceFragment:可以展示層級嵌套的 Preference 對象列表。PreferenceFragment 類似於 PreferenceActivity,該類一般用於為應用程式編寫設置頁面。

必須重寫 onCreateView() 方法,為 Fragment 綁定布局,該方法返回的 View 就是 Fragment 的根視圖。

!請注意:若繼承的 Fragment 是 ListFragment,onCreateView() 方法已默認返回了 ListView 對象,故無需再重寫該方法。


下面是一個將 example_fragment.xml 布局文件綁定至 ExampleFragment 的示例:


方法回傳的第二個參數 ViewGroup 來自宿主 Activity 容器布局,Fragment 的布局將其作為根視圖插入至該視圖中(is the parent ViewGroup (from the activity’s layout) in which your fragment layout will be inserted)。第三個參數 Bundle 用於回傳之前佔據該位置的 Fragment 實例所保存的 Bundle 信息,當該 Fragment 的新實例處於 resume 狀態時,該參數被回傳(provides data about the previous instance of the fragment, if the fragment is being resumed )。

inflate() 方法需要三個參數:

參數1(int):需要綁定的Layout的資源ID;

參數2(ViewGroup):綁定的Layout布局的父視圖;

參數3(boolean):是否需要將參數1的Layout資源依附於(should be attached to)參數2的ViewGroup上,上例中為false,表示不依附。(系統已經默認將Layout插入至ViewGroup中,若為true,將添加一層冗餘的視圖(redundant view group in the final layout))。

一般地,Fragment 綁定的UI作為宿主 Activity 的一部分,嵌套在整個 Activity 層級視圖中。將 Fragment 加入 Activity ,有如下兩種方式:

方式一:使用fragment標籤加入


其中標籤 <fragment> 中的屬性 android:name 指定 Fragment 的全限定類名(specifies the Fragment class to instantiate in the layout)。

當系統加載 Activity 的 layout 視圖時,同時加載 Fragment 綁定的視圖,並回調相應 Fragment 的 onCreateView() 方法,系統將 <fragment> 標籤替換為 onCreateView() 方法返回的 View

!請注意:必須為fragment設定唯一的身份標識,以便當宿主Activity為restart狀態時可以恢復(restore)fragment。


有三種為fragment設置唯一標識的方式:

通過 android:id 屬性為 fragment 指定唯一ID;

通過 android:tag 屬性為 fragment 指定唯一字符串標識;

若上述兩種凡是均未指定,則該 fragment 的標識為其父容器控制項的ID(the system uses the ID of the Container view)。

方式二:編寫代碼將 fragment 動態添加至現存的 ViewGroup(Or, programmatically add the fragment to an existing ViewGroup)

當 Activity 處於 running 狀態時,可以將 fragment 添加至 Activity 布局 layout 中,您只需要指定 fragment 的父容器就行了。

為了在 Activity 中對 fragment 做添加、刪除、替換等操作(add, remove, or replace a fragment),需調用 FragmentTransaction

FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

使用 add() 方法添加 fragment,並指定其添加位置,最後調用 commit() 方法提交事務:

ExampleFragment fragment = new ExampleFragment();fragmentTransaction.add(R.id.fragment_container, fragment);fragmentTransaction.commit();

有時,為了讓 fragment 執行一些後臺行為(background behavior),可以不為 fragment 綁定UI。

為了給 Activity 添加這種不帶UI的 fragment,需調用 add(Fragment, String) 方法,其中第二個參數 String 是為 fragment 指定一個唯一的 tag 標籤,而非指定 View的ID(supplying a unique string 「tag」 for the fragment, rather than a view ID)。由於未綁定UI,故無需重寫 onCreateView() 方法。

String 標籤為未綁定UI的 fragment 指定唯一標識並不嚴謹(Supplying a string tag for the fragment isn’t strictly for non-UI fragments),您也可以給綁定了UI的 fragment 指定 String 標籤;但是若某個 fragment 未綁定UI,那麼只能用 String 標籤來標識該 fragment,若需要在 Activity 中獲取該 fragment,需調用 findFragmentByTag() 方法。

在開發者下載的SDK中,有一個不帶UI的fragment的示例程序 FragmentRetainInstance.Java ,它的路徑為:

<sdk_root>/APIDemos/app/src/main/java/com/example/android/apis/app/FragmentRetainInstance.java

為了在 Activity 中管理 Fragment,需調用 getFragmentManager() 方法獲取 FragmentManager 實例。您可以使用 FragmentManager 完成如下操作:

調用 findFragmentById() 方法獲取由 Activity 管轄的綁定了UI的 Fragment 實例(for fragments that provide a UI in the activity layout);調用 findFragmentByTag() 方法獲取由 Activity 管轄的未綁定UI的 Fragment 實例(for fragments that do or don’t provide a UI);

調用 popBackStack() 方法將 Fragment 從後退棧中彈出;

調用 addOnBackStackChangedListener() 方法註冊監聽器,用於監聽後退棧的變化。

使用 Fragment 的最大好處就是可實現動態添加、刪除、替換 等 操作,實現與用戶的交互。每一組向 Activity 提交的變化稱為事務(Each set of changes that you commit to the activity is called a transaction),您可以使用 FragmentTransaction 這個API操作事務。您也可以將事務保存在由 Activity 管轄的後退棧中,以方便用戶點擊後退鍵來查看 Fragment 的變化。

使用示例如下:

FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

每個事務都是您希望同時執行的一組變化(Each transaction is a set of changes that you want to perform at the same time.),這些變化包括 add(), remove(), 和 replace() 等操作,最後,為了使事務在Activity中生效,需調用 commit() 方法。

在調用 commit() 方法之前,可以調用 addToBackStack() 方法,將該事物添加到由宿主 Activity 管轄的 Fragment 後退棧中。通過點擊後退鍵,用戶可以查看該後退棧中的內容。

舉例如下:


在上述示例中,將 newFragment 對象所綁定的UI視圖替換至以 R.id.fragment_container 為ID的 layout 容器中,並調用 addToBackStack() 方法將該事物添加至後退棧中。這樣,這一事務就被保存到了後退棧中,用戶可以找回該事物;另外,點擊 back按鈕 也可以顯示替換之前的 Fragment。

若您在一組事務中進行了不止一項操作(如同時調用了 add()、remove() 等方法),並調用 addToBackStack() 方法將該事務加入後退棧中,那麼在調用 commit() 之前,這些操作將作為一個事務整體存在於後退棧中,用戶點擊 back將會整體回退。

使用 FragmentTransaction 操作事務時,操作順序是沒有規定的,但以下兩點必須注意:

若在事務中進行了 remove 操作,而且在提交事務之前未調用 addToBackStack() 方法,那麼該 Fragment 會被 destroy,用戶點擊back將無法找回;相反,若調用了 addToBackStack(),那麼 Fragment 將處於 stopped 狀態,用戶點擊back鍵將可以找回。

對於每個 Fragment 事務,您可以在調用 commit() 方法之前調用 setTransition() 方法,為事務的變化添加動畫。

調用 commit() 方法並不會立即執行事務,因為執行事務是在UI線程(主線程)中進行的,只有當主線程空閒時,才會執行事務操作(it schedules it to run on the activity’s UI thread (the 「main」 thread) as soon as the thread is able to do so)。如有必要,可以在UI線程中調用 executePendingTransactions() 方法,以便在 commit() 方法調用後立即執行提交的事務。但一般沒必要這麼做,除非事務的操作依賴於其他線程(Doing so is usually not necessary unless the transaction is a dependency for jobs in other threads)。

調用 commit() 提交事務的時機應是「Activity保存狀態之前」( prior to the activity saving its state),即用戶離開 Activity 之前。若試圖在這個時機之後調用 commit(),系統將拋出異常。

儘管一個 Fragment 實例獨立於一個 Activity,並且一個 Fragment 可以嵌入到多個 Activity 中(可以重用),但 Activity 包含的 Fragment 將直接有這個 Activity 管轄。

具體來說,Fragment 可以通過 getActivity() 方法獲取其宿主 Activity 的對象引用,通過該引用,可以調用 Activity 中的 findViewById() 方法獲得布局中的視圖控制項:

View listView = getActivity().findViewById(R.id.list);

類似地,也可以在 Activity 中獲取 Fragment 的實例:

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);

有些情況下,您需要 Fragment 響應 Activity 的事件,好的做法是在 Fragment中添加回調接口,並在其宿主 Activity 中實現。當 Activity 通過接口接收了回調,它可以與其他 Fragment 共享信息(When the activity receives a callback through the interface, it can share the information with other fragments in the layout as necessary)。

舉例來說,一個新聞應用的 Activity 包含兩個 Fragment,其中 Fragment A 用於顯示新聞標題,而 Fragment B 用於顯示新聞內容。Fragment A 必須告訴Activity 它的列表項何時被點擊,這樣 Activity 可以控制 Fragment B 顯示新聞內容,所以必須在 Fragment A 中定義一個事件監聽接口 OnArticleSelectedListener

public static class FragmentA extends ListFragment {
   ...    // Container Activity must implement this interface    public interface OnArticleSelectedListener {
       public void onArticleSelected(Uri articleUri);    }
   ...
}

接著,需要在 Activity 中實現 OnArticleSelectedListener 接口,並重寫 onArticleSelected() 方法,並通知 Fragment B 來自於 Fragment A 的點擊事件。為了保證宿主 Activity 實現該接口,需在 Fragment A 中的回調方法 onAttach() 中做如下工作(當 Fragment 添加至 Activity 時,系統回調 onAttach() 方法):


若宿主 Activity 未實現 OnArticleSelectedListener 接口,Fragment 將拋出 ClassCastException 異常。正常情況下,Fragment A 的成員變量 mListener 持有實現了 OnArticleSelectedListener 接口的對象引用,所以,Fragment A 可以通過宿主 Activity 傳遞點擊事件。具體來說,當用戶點擊了某個列表項時,Fragment A 中的 onListItemClick() 方法被回調,在該方法中調用 OnArticleSelectedListener 接口中的 onArticleSelected() 方法(程序執行的實際上是重寫的 onArticleSelected() 方法)。

在 Fragment 中回調 onCreateOptionsMenu() 方法可以創建菜單項,為了保證這個方法能夠被系統回調,您必須在 onCreate() 生命周期方法中調用 setHasOptionsMenu() 方法。

menu 項被點擊時,Fragment 也像 Activity 一樣,通過 onOptionsItemSelected() 回調方法響應 menu 項的點擊事件。

與Activity類似,Fragment也同樣有三種狀態:

Resumed:在一個處於 running 狀態的 Activity 中,Fragment 處於可見狀態(The fragment is visible in the running activity);

Paused:另一個 Activity 處於前臺並獲得了焦點,該 Fragment 的宿主 Activity 並未被全部遮擋;

Stopped:Fragment 不可見。可能由於宿主 Activity 已不可見或 Fragment已被 Activity 移除(但加入到了Fragment後退棧中),一個處於 stopped 狀態的 Fragment 仍是 alive 的,但當宿主 Activity 被 kill 時,該 Fragment也 將被 kill


與 Activity 類似,您同樣可以使用 Bundle 對象保存 fragment 的狀態信息,以防宿主 Activity 所在進程被 kill、而迫使 Activity 重新創建、接著 Fragment 才能重新創建、這時 Fragment 的狀態信息將丟失。 

重寫 Fragment 的 onSaveInstanceState() 回調方法,並在回傳的 Bundle 參數中保存狀態信息;接著在 onCreate(), onCreateView(), onActivityCreated() 方法中獲得保存的狀態信息。

Activity 與 Fragment 生命周期的一個最大區別就是它們的實例是如何存儲在各自的後退棧中的( how one is stored in its respective back stack):

在默認情況下,Activity 實例會在 stop 狀態時被壓入由系統管理的 Activity 後退棧中(An activity is placed into a back stack of activities that’s managed by the system when it’s stopped, by default),所以用戶可以通過點擊back按鈕恢復已入棧的 Activity 實例。

對於fragment,只能在操作事務時顯式地調用 addToBackStack() 方法將 fragment 壓入由宿主Activity 管理的 fragment 後退棧。

除此之外,Fragment 與 Activity 的生命周期非常相似,您只需了解 Activity 的生命周期是如何影響 Fragment 的生命周期就行了。

!請注意:如需在 Fragment 中使用 Context 對象,您可以調用 getActivity() 方法,但這個方法只能是在 Fragment 已經依附於 Activity 後才能調用( to call getActivity() only when the fragment is attached to an activity)。當 Fragment 未依附於某個 Activity 或 Fragment 已經處於其生命周期的末尾而不再依附於某個 Activity 時,調用 getActivity() 方法會直接返回 null。

宿主 Activity 的生命周期直接影響其管轄的 fragment 的生命周期,Activity 的每一個生命周期方法被回調後,其管轄的 fragment 的相應生命周期方法會跟著回調。如當 Activity 回調 onPause() 時,fragment 也會回調 onPause()

fragment的其他生命周期方法如下:

onAttach():當 fragment 實例依附於 Activity 時被回調,Activity 對象的引用回傳到該方法中(the Activity is passed in here);

onCreateView():為 fragment 綁定UI視圖時,該方法被回調;

onActivityCreated():當宿主 Activity 的 onCreate() 方法返回後,該方法被回調;

onDestroyView():當與 fragment 綁定的UI視圖被移除時,該方法被回調;

onDetach():當 fragment 不再依附於 Activity 時,該方法被回調;

除了上述方法外,其他的 fragment 生命周期方法均由其宿主 Activity 的生命周期直接影響。有些 Activity 的生命周期方法直接影響了多個 fragment 的生命周期方法,比如說,當 Activity 的 onCreate() 被回調時,將導致 fragment 的 onAttach()、onCreate()、onCreateView()、onActivityCreate() 被連續回調( you can see how each successive state of the activity determines which callback methods a fragment may receive)。如上圖所示。

一旦 Activity 處於 resume 狀態時,您可以自由地添加或移除 fragment,也就是說,只有當 Activity 的狀態為 resume 時,fragment 才能夠自由地控制自己的生命周期。

當 Activity 不在 resume 狀態時,fragment 的生命周期將由宿主 Activity 控制。

如果你有好的技術文章想和大家分享,歡迎向我的公眾號投稿,投稿具體細節請在公眾號主頁點擊「投稿」菜單查看。

歡迎長按下圖 -> 識別圖中二維碼或者掃一掃關注我的公眾號:


相關焦點

  • Fragment 番外篇——TabLayout+ViewPager+Fragment
    你必須實現一個PagerAdapter來生成這些顯示的頁面。ViewPager經常和Fragment一起使用。而且呢Google非常貼心的提供了兩個類FragmentPagerAdapter和FragmentStatePagerAdapter來應付那些一般場景。其實從ViewPager的說明中,我們基本上就能知道ViewPager是什麼以及如何使用了。
  • 錯誤終結者:Fragment在ViewPager中的正確應用
    今天的文章內容是關於ViewPager的,很多同學可能會吐槽:怎麼還寫這種「低級」的內容!為什麼?因為絕大多數的同學都用錯了,當然這主要的原因是搜尋引擎推出來的文章大多都是錯的!正文一、錯誤用法不知道有多少同學是這樣用ViewPager的?
  • 【譯】2020 年 Fragment 最新文檔(上),該更新知識庫啦
    前言很高興見到你 👋,我是 Flywith24 。最近 Android 官方針對 Fragment 文檔進行了重新編寫,使其適應 2020 年最佳實踐的快速發展。您可以在一個 activity 、多個 activity 甚至是 fragment 中(嵌套場景)使用相同的 fragment 實例。考慮到這一點,您應該在 fragment 中僅提供管理自己 UI 所需的邏輯,避免在 fragment 內部依賴或操作另一個 fragment。
  • 帶你解鎖Fragment 間通信的新方式
    https://medium.com/androiddevelopers/now-in-android-17-9d73f7bed7f通過這篇文章你將學習到以下內容,將在譯者思考部分會給出相應的答案新 Fragment 間通信的方式的使用?新 Fragment 間通信的源碼分析?匯總 Fragment 之間的通信的方式?
  • Android Fragment+ViewPager 組合,一些你不可不知的注意事項
    在此之前,如果你對 Fragment 的認知和使用還有不清楚的地方,一定要先閱讀前面兩篇文章:對於這種組合使用,ViewPager 提供了兩種頁面適配器來管理不同 Fragment 之間的滑動切換:FragmentPagerAdapter 和 FragmentStatePagerAdapter。先來看一下他們的基本使用,稍後再分析二者之間的區別。
  • 【Android基礎】Fragment 詳解之Fragment生命周期
    注意:在Fragment中你如果要獲取一個Context對象,你可以調用getActivity()方法,但是調用getActivity()方法必須要在Fragment於Activity關聯起來之後,否則getActivity()返回為null。上面說的都是Fragment的一些生命周期相關知識,下面來看看如何創建Fragment並且添加一個View給Fragment。
  • fragment design x Starbucks 藤原浩又出星巴克聯名了!
    裡原宿教父藤原浩與星巴克幾乎每年都會推出的聯名系列,今年份的fragment design x Starbucks於周二,正式在日本發布,並確定將於6月7日、6月24日分別發售兩套不同的聯名版本。先一步上市的,將是fragment design與星巴克共同推出的首個不鏽鋼巴克杯、同系列保溫杯和星享卡。
  • 2020 年 Fragment 最新文檔(下),該更新知識庫啦
    很高興見到你 👋,我是 Flywith24 。
  • 關於非金屬3D列印注塑模具,你所需知道的一切都在這裡
    通過本文,你可以了解為什麼存在3D列印的注射模具,以及製作的工藝過程。3D列印注塑模具,塑造未來要了解什麼是3D列印的注塑模具,我們從常規的注塑成型開始。注射成型是塑料工業中最常見的製造工藝之一。本質上,將熔融塑料注入模具型腔中,使其在冷卻時變硬,然後打開模具並取出塑料件。
  • 學習安卓開發[2]-在Activity中託管Fragment
    ); FragmentManager fm = getSupportFragmentManager(); Fragment fragment = fm.findFragmentById(R.id.fragment_container);if (fragment == null) {
  • fragment design x Pokémon聯名!小閃電再度起航
    fragment design x Pokémon閃電系列與2018年10月首次亮相後,今年則又以新面貌問世,藤原浩這位日本潮流教父仿佛有點石成金之力,一個fragment design閃電logo配以人氣動Pokémon就可讓整個潮流界為之一震。
  • 我要知道關於《你妻子的一切》
    而勝基只提了一個要求:我要知道關於你妻子的一切。膽小的丈夫鬥賢,蛻變的妻子貞仁,花招百出的情聖張勝基,上演了一出令人深思的喜劇。「我要知道你妻子的一切」這部探討婚姻問題的電影,不同於韓國其他題材沉重的電影,不陰暗,不壓抑。
  • OAKLEY與fragment design打造新款聯名眼鏡
    可以任意隨心使用的眼鏡,媒體如此形容並非首度合作的 OAKLEY 與 fragment design 的最新聯名。OAKLEY 成立於 1975 年,從機車握把起家,到戶外運動選手最愛的眼鏡品牌之一,近來也是動作頻頻,之前與日本藝術家山口歷的合作,這次再度與 fragment design 合作推出四款太陽眼鏡,包括 2020 年是 35 周年的 Frogsins,可以稱為是OKALEY最為人熟知的款式,使用 PRIZM 鏡片加強色彩,輕量耐久地 O Matter鏡架,包括藤原浩等一眾創作人都是使用者,也能理解為什麼這次的聯名系列有包括
  • 關於宮縮,這裡有你想知道的一切
    關於宮縮,這裡有你想知道的一切 如果懷孕了,你可能會想了解宮縮。畢竟它是生產的重要過程,對很多女性來說,也是生產中最令人恐懼的事情之一。關於宮縮,你可能有一百個問題想要問。
  • 加拿大醫療丨關於魁北克醫療卡,你所需要知道的一切!
    (分享嘉賓:coco)這篇文章要跟大家分享的是在魁省的醫療保險卡,也就是太陽卡,你所應該知道的一切。很多人選擇來加拿大,我相信免費的全民醫療保險制度是大家看中的其中一個原因。要申請太陽卡,你要去魁北克的醫療保險管理局,簡稱RAMQ。不需要提前預約,到了那之後到會有叫號的,你就排隊等待你的號碼,然後去辦理就可以了。四、辦理太陽卡所需材料不同的身份需要的申請材料也不太一樣。
  • 藤原浩曝光fragment design與遊戲《Cyberpunk 2077》全新聯名系列
    財經網生活訊近日,財經網生活由HYPEBEAST獲悉,潮流教父藤原浩(Hiroshi Fujiwara)在個人Instagram上親自曝光了fragment design與《Cyberpunk2077》聯名系列的視頻。有評論稱,藤原浩將時尚和遊戲領域融合在一起,開啟了一個全新世代。
  • NIKEiD 教程分享,從打造一雙 fragment 配色的 Air Max 1 學會定製竅門
    說到 NIKEiD ,相信很多朋友也有不少經驗,但你是否也遇到了這樣一個問題:就是 iD 的結果沒有自己想像中的理想,而那些一直好奇卻遲遲未採取行動的夥伴,也許是被看上去複雜的程序給「嚇」到了。遇到以上煩惱的朋友,沒關係,此篇文章就是要為你排解這些「疑難雜症」的。
  • 找來fragment design 及 UNDEFEATED,誰這麼大面子?
    本次官方聯名 Medicom Toy 旗下的人氣 BE@RBRICK 玩偶,為了營造話題,fragment design 及 UNDEFEATED 兩大潮流單位參與其中,對於整個單品的影響力提升自然不容小覷。值得關注的是,均以 1000% 尺寸為基礎設計,加持而來的則是高達 70cm 的震撼感。品牌的 Logo 加持其中,自然是購買及收藏的原始動力。
  • 關於焦慮你需要知道的一切
    關於焦慮你需要知道的一切概述焦慮是你身體對壓力的自然反應。這是一種對即將發生的事情的恐懼或憂慮。開學的第一天,去參加一個工作面試,或者發表演講,可能會讓大多數人感到恐懼和緊張。感覺可以是從你肚子裡有蟲子到心跳加速。你可能會覺得失去控制,好像你的思想和身體脫節了。人們經歷焦慮的其他方式包括噩夢、恐慌發作、痛苦的想法或你無法控制的記憶。你可能有一種普遍的恐懼感和憂慮感,或者你可能害怕某個特定的地方或事件。
  • 關於假髮你需要知道的一切
    關於假髮你需要知道的一切「轉」Everything you need to know about wigs然而,假髮似乎正在逐漸變得越來越主流,它被用作一種不置可否的方式來調整頭髮的顏色,以及改變你的風格,而實際上並沒有改變你的頭髮,讓我們能夠輕鬆自如地表達自己的新發現。