日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android之Fragment(官网资料翻译)二

發布時間:2025/4/16 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android之Fragment(官网资料翻译)二 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

添加一個用戶界面

fragment通常用來作為一個activity的用戶界面的一部分,并將它的layout提供給activity.為了給一個fragment提供一 個layout,你必須實現 onCreateView()回調方法, 當到了fragment繪制它自己的layout的時候,Android系統調用它.你的此方法的實現代碼必須返回一個你的fragment的 layout的根view.
注意: 如果你的fragment是ListFragment的子類,它的默認實現是返回從onCreateView()返回一個ListView,所以一般情況下不必實現它.
從onCreateView()返回的View, 也可以從一個layout的xml資源文件中讀取并生成. 為了幫助你這么做, onCreateView() 提供了一個LayoutInflater 對象.

舉個例子, 這里有一個Fragment的子類, 從文件 example_fragment.xml 加載了一個layout:

  • public?static?class?ExampleFragment?extends?Fragment?{ ?
  • ????@Override?
  • ????public?View?onCreateView(LayoutInflater?inflater,?ViewGroup?container, ?
  • ?????????????????????????????Bundle?savedInstanceState)?{ ?
  • ????????//?Inflate?the?layout?for?this?fragment ?
  • ????????return?inflater.inflate(R.layout.example_fragment,?container,?false); ?
  • ????} ?
  • }?
  • 傳入onCreateView()的container參數是你的fragmentlayout將被插入的父ViewGroup(來自activity的layout) savedInstanceState 參數是一個Bundle, 如果fragment是被恢復的,它提供關于fragment的之前的實例的數據,

    inflate() 方法有3個參數:

    • 想要加載的layout的resource ID.
    • 加載的layout的父ViewGroup.
      傳入container是很重要的, 目的是為了讓系統接受所要加載的layout的根view的layout參數,
      由它將掛靠的父view指定.
    • 布爾值指示在加載期間, 展開的layout是否應當附著到ViewGroup (第二個參數).
      (在這個例子中, 指定了false, 因為系統已經把展開的layout插入到container –傳入true會在最后的layout中創建一個多余的view group.)

    將fragment添加到activity

    通常地, fragment為宿主activity提供UI的一部分, 被作為activity的整個viewhierarchy的一部分被嵌入. 有2種方法你可以添加一個fragment到activity layout:

    在activity的layout文件中聲明fragment
    在這種情況下,你可以像為View一樣, 為fragment指定layout屬性.例子是一個有2個fragment的activity的layout:
    ?

  • <?xml?version="1.0"?encoding="utf-8"?>?
  • <LinearLayout?xmlns:android="http://schemas.android.com/apk/res/android"?
  • ????android:orientation="horizontal"?
  • ????android:layout_width="match_parent"?
  • ????android:layout_height="match_parent">?
  • ????<fragment?android:name="com.example.news.ArticleListFragment"?
  • ????????????android:id="@+id/list"?
  • ????????????android:layout_weight="1"?
  • ????????????android:layout_width="0dp"?
  • ????????????android:layout_height="match_parent"?/>?
  • ????<fragment?android:name="com.example.news.ArticleReaderFragment"?
  • ????????????android:id="@+id/viewer"?
  • ????????????android:layout_weight="2"?
  • ????????????android:layout_width="0dp"?
  • ????????????android:layout_height="match_parent"?/>?
  • </LinearLayout>?
  • ?<fragment> 中的 android:name屬性指定了在layout中實例化的Fragment類.
    當系統創建這個activity layout時,它實例化每一個在layout中指定的fragment,并調用每一個上的onCreateView()方法,來獲取每一個 fragment的layout.系統將從fragment返回的 View直接插入到<fragment>元素所在的地方.
    注意
    : 每一個fragment都需要一個唯一的標識,如果activity重啟,系統可以用來恢復fragment(并且你也可以用來捕獲fragment來處理事務,例如移除它.)

    有3種方法來為一個fragment提供一個標識:

    • 為 android:id 屬性提供一個唯一ID.
    • 為 android:tag 屬性提供一個唯一字符串.
    • 如果以上2個你都沒有提供, 系統使用容器view的ID.

    撰寫代碼將fragment添加到一個已存在的ViewGroup.

    當activity運行的任何時候, 都可以將fragment添加到activity layout.只需簡單的指定一個需要放置fragment的ViewGroup.為了在你的 activity中操作fragment事務(例如添加,移除,或代替一個fragment),必須使用來自FragmentTransaction 的API.
    可以按如下方法,從你的Activity取得一個 FragmentTransaction 的實例:

  • FragmentManager?fragmentManager?=getFragmentManager(); ?
  • FragmentTransaction?fragmentTransaction?=fragmentManager.beginTransaction();?
  • ?然后你可以使用 add() 方法添加一個fragment, 指定要添加的fragment和要插入的view.

  • ExampleFragment?fragment?=?newExampleFragment(); ?
  • fragmentTransaction.add(R.id.fragment_container,fragment); ?
  • fragmentTransaction.commit();?
  • ?add()的第一個參數是fragment要放入的ViewGroup, 由resource ID指定,第二個參數是需要添加的fragment.一旦用FragmentTransaction做了改變,為了使改變生效,必須調用commit().

    添加一個無UI的fragment

    之前的例子展示了對UI的支持, 如何將一個fragment添加到activity.然而,也可以使用fragment來為activity提供后臺行為而不用展現額外的UI.
    要添加一個無UI的fragment, 需要從activity使用 add(Fragment, String)來添加fragment (為fragment提供一個唯一的字符串"tag", 而不是一個view ID).這么做添加了fragment,但因為它沒有關聯到一個activity layout中的一個view, 所以不會接收到onCreateView()調用.因此不必實現此方法.
    為fragment提供一個字符串tag并不是專門針對無UI的fragment的–也可以提供字符串tag給有UI的fragment–但是如果fragment沒有UI,那么這個tag是僅有的標識它的途徑.如果隨后你想從activity獲取這個fragment, 需要使用 findFragmentByTag().

    管理Fragment

    ?

    ?

    要在activity中管理fragment,需要使用FragmentManager. 通過調用activity的getFragmentManager()取得它的實例.
    可以通過FragmentManager做一些事情, 包括:

    • 使用findFragmentById()(用于在activity layout中提供一個UI的fragment)或findFragmentByTag()(適用于有或沒有UI的fragment)獲取activity中存在的fragment
    • 將fragment從后臺堆棧中彈出, 使用 popBackStack() (模擬用戶按下BACK 命令).
    • 使用addOnBackStackChangeListener()注冊一個監聽后臺堆棧變化的listener.

    處理Fragment事務

    關于在activity中使用fragment的很強的一個特性是:根據用戶的交互情況,對fragment進行添加,移除,替換,以及執行其他動作.提交給activity的每一套變化被稱為一個事務,可以使用在FragmentTransaction中的 API 處理.我們也可以保存每一個事務到一個activity管理的backstack,允許用戶經由fragment的變化往回導航(類似于通過 activity往后導航).

    從 FragmentManager 獲得一個FragmentTransaction實例 :

  • FragmentManager?fragmentManager?=getFragmentManager(); ?
  • FragmentTransaction?fragmentTransaction?=fragmentManager.beginTransaction();?
  • 每一個事務都是同時要執行的一套變化.可以在一個給定的事務中設置你想執行的所有變化,使用諸如 add()、remove()和 replace().然后, 要給activity應用事務, 必須調用 commit().

      在調用commit()之前, 你可能想調用 addToBackStack(),將事務添加到一個fragment事務的backstack. 這個back stack由activity管理, 并允許用戶通過按下 BACK按鍵返回到前一個fragment狀態.

    舉個例子, 這里是如何將一個fragment替換為另一個, 并在后臺堆棧中保留之前的狀態:

  • //?Create?new?fragment?and?transaction ?
  • Fragment?newFragment?=?newExampleFragment(); ?
  • FragmentTransaction?transaction?=getFragmentManager().beginTransaction(); ?
  • //?Replace?whatever?is?in?thefragment_container?view?with?this?fragment, ?
  • //?and?add?the?transaction?to?the?backstack ?
  • transaction.replace(R.id.fragment_container,newFragment); ?
  • transaction.addToBackStack(null); ?
  • //?Commit?the?transaction ?
  • transaction.commit();?
  • ?在這個例子中,newFragment替換了當前layout容器中的由R.id.fragment_container標識的fragment.通過調用 addToBackStack(), replace事務被保存到back stack,因此用戶可以回退事務,并通過按下BACK按鍵帶回前一個fragment.
    如果添加多個變化到事務(例如add()或remove())并調用addToBackStack(),然后在你調用commit()之前的所有應用的變化會被作為一個單個事務添加到后臺堆棧, BACK按鍵會將它們一起回退.

    ?添加變化到 FragmentTransaction的順序不重要, 除以下例外:

    ?

    • 必須最后調用 commit().
    • 如果添加多個fragment到同一個容器, 那么添加的順序決定了它們在view hierarchy中顯示的順序.

    ?當執行一個移除fragment的事務時, 如果沒有調用 addToBackStack(), 那么當事務提交后,那個fragment會被銷毀,并且用戶不能導航回到它. 有鑒于此, 當移除一個fragment時,如果調用了addToBackStack(), 那么fragment會被停止, 如果用戶導航回來,它將會被恢復.
    提示: 對于每一個fragment事務, 你可以應用一個事務動畫,通過在提交事務之前調用setTransition()實現.

    調用 commit() 并不立即執行事務.恰恰相反, 它將事務安排排期, 一旦準備好,就在activity的UI線程上運行(主線程).如果有必要, 無論如何, 你可以從你的UI線程調用executePendingTransactions()來立即執行由commit()提交的事務. 但這么做通常不必要,除非事務是其他線程中的任務的一個從屬.

    警告:你只能在activity保存它的狀態(當用戶離開activity)之前使用commit()提交事務.

    ?

    ?

    轉載于:https://blog.51cto.com/whatandroid/1141553

    《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的android之Fragment(官网资料翻译)二的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。