<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Fragment 使用詳解

          共 10886字,需瀏覽 22分鐘

           ·

          2020-12-07 13:15

          和你一起終身學(xué)習(xí),這里是程序員Android

          經(jīng)典好文推薦,通過閱讀本文,您將收獲以下知識點(diǎn):

          一、Fragment 簡介
          二、Fragment的設(shè)計(jì)原理
          三、Fragment 生命周期
          四、Fragment 在Activity中的使用方法
          五、動(dòng)態(tài)添加Fragment到Activity的方法
          六、Activity 中獲取Fragment
          七、Fragment 獲取宿主Activity的方法
          八、兩個(gè)Fragment的通訊的方法
          九、Fragment 與 Activity通訊方法

          一、 Fragment 簡介

          在學(xué)Fragment之前我們需要了解一下Fragment的繼承關(guān)系,F(xiàn)ragment 繼承關(guān)系如下:

          java.lang.Object
          ? android.app.Fragment

          Fragment 片段,在Activity 中常用于負(fù)責(zé)用戶界面部分,可以將多個(gè)Fragment組合在一個(gè)Activity中來創(chuàng)建多窗口UI,或者在Activity中重復(fù)使用某個(gè)Fragment。您可以將Fragment 視為Activity的模塊化組成部分,Fragment具有自己的生命周期,能接收自己的輸入事件,并且可以在Activity運(yùn)行時(shí)候添加或者移除Fragment

          Fragment必須嵌套在Activity中,其生命周期受Activity生命周期的影響。

          二、Fragment的設(shè)計(jì)原理

          Fragment主要是為了給大屏幕(平板等)上更加動(dòng)態(tài)和靈活的UI設(shè)計(jì)提供支持。由于平板電腦的屏幕比手機(jī)屏幕大得多,因此可用于組合和交換UI 組件的空間更大。利用Fragment實(shí)現(xiàn)此類設(shè)計(jì)時(shí),您無需管理對視圖層次結(jié)構(gòu)的復(fù)雜更改。通過將 Activity布局分成Fragment,您可以在運(yùn)行時(shí)修改Activity 的外觀,并在由 Activity 管理的返回棧中保留這些更改。

          您應(yīng)該將每個(gè)Fragment都設(shè)計(jì)為可重復(fù)使用的模塊化Activity 組件。也就是說,由于每個(gè)Fragment 都會(huì)通過各自的生命周期回調(diào)來定義其自己的布局和行為,您可以將一Fragment加入多個(gè)Activity,因此,您應(yīng)該采用可復(fù)用式設(shè)計(jì),避免直接從某個(gè)Fragment直接操縱另一個(gè)Fragment。這特別重要,因?yàn)槟K化片段讓您可以通過更改Fragment的組合方式來適應(yīng)不同的屏幕尺寸。在設(shè)計(jì)可同時(shí)支持平板電腦和手機(jī)的應(yīng)用時(shí),您可以在不同的布局配置中重復(fù)使用您的Fragment,以根據(jù)可用的屏幕空間優(yōu)化用戶體驗(yàn)。例如,在手機(jī)上,如果不能在同一 Activity內(nèi)儲(chǔ)存多個(gè)片段,可能必須利用單獨(dú)片段來實(shí)現(xiàn)單窗格UI

          通過兩個(gè)Fragment組合成一個(gè)Activity適應(yīng)平板,通過一個(gè)Fragment來適應(yīng)手機(jī)

          三、Fragment 生命周期

          1. Fragment 生命周期圖

          Fragment 生命周期圖

          2. Fragment生命周期回調(diào)方法

              public void onAttach(Context context) {
          // TODO Auto-generated method stub
          Log.i(TAG, "----onAttach----");
          super.onAttach(context);
          }

          @Override
          public void onCreate(Bundle savedInstanceState) {
          Log.i(TAG, "----onCreate----");
          // 在Fragment 中調(diào)用Activity 中的方法
          ((FragmentAutoCreate) getActivity()).test();

          // TODO Auto-generated method stub
          super.onCreate(savedInstanceState);
          }

          @Override
          public View onCreateView(LayoutInflater inflater, ViewGroup container,
          Bundle savedInstanceState) {
          Log.i(TAG, "----onCreateView----");
          // 將layout布局轉(zhuǎn)換成View
          View view = inflater.inflate(R.layout.fragment_left_layout, null);
          Toast.makeText(getActivity(),
          "通過對外提供方法setMsg(String msg),供Activity 調(diào)用", 0).show();
          return view;

          }

          @Override
          public void onActivityCreated(Bundle savedInstanceState) {
          Log.i(TAG, "----onActivityCreated----");
          // TODO Auto-generated method stub
          super.onActivityCreated(savedInstanceState);
          }

          @Override
          public void onStart() {
          Log.i(TAG, "----onStart----");
          // TODO Auto-generated method stub
          super.onStart();
          }

          @Override
          public void onResume() {
          Log.i(TAG, "----onResume----");
          // TODO Auto-generated method stub
          super.onResume();
          }

          @Override
          public void onPause() {
          Log.i(TAG, "----onPause----");
          // TODO Auto-generated method stub
          super.onPause();
          }

          @Override
          public void onStop() {
          Log.i(TAG, "----onStop----");
          // TODO Auto-generated method stub
          super.onStop();
          }

          @Override
          public void onDestroyView() {
          Log.i(TAG, "----onDestroyView----");
          // TODO Auto-generated method stub
          super.onDestroyView();
          }

          @Override
          public void onDestroy() {
          Log.i(TAG, "----onDestroy----");
          // TODO Auto-generated method stub
          super.onDestroy();
          }

          @Override
          public void onDetach() {
          Log.i(TAG, "----onDetach----");
          // TODO Auto-generated method stub
          super.onDetach();
          }

          3.Fragment 在宿主Activity 的生命周期

          Fragment不能脫離Activity而存在,其生命周期受Activity 生命周期影響

          Activity于Fragment生命周期交互圖

          Log 打印信息如上

          四、Fragment 在Activity中的使用方法

          1.靜態(tài)添加Fragment到Activity

            <fragment
          android:id="@+id/left_fragment"
          android:layout_width="0dp"
          android:layout_height="match_parent"
          android:layout_weight="1"
          class="com.programandroid.Fragment.FragmentLeft" />

          2.創(chuàng)建自定義Fragment類

          實(shí)現(xiàn)方法如下

          public class FragmentRight extends Fragment {
          @Override
          public View onCreateView(LayoutInflater inflater, ViewGroup container,
          Bundle savedInstanceState) {
          // 將layout布局轉(zhuǎn)換成View
          View view = inflater.inflate(R.layout.fragment_right_layout, null);

          // 取出值
          Bundle values = getArguments();
          if (values != null) {
          String str = values.getString("key", "");
          Toast.makeText(getActivity(), "接收Activity傳遞的至為:" + str, 0).show();

          } else {
          Toast.makeText(getActivity(), "接收Activity傳遞的至為空", 0).show();

          }

          return view;

          }
          }

          五、動(dòng)態(tài)添加Fragment到Activity中

          1.創(chuàng)建自定義Fragment類

          public class FragmentRight extends Fragment {
          @Override
          public View onCreateView(LayoutInflater inflater, ViewGroup container,
          Bundle savedInstanceState) {
          // 將layout布局轉(zhuǎn)換成View
          View view = inflater.inflate(R.layout.fragment_right_layout, null);

          // 取出值
          Bundle values = getArguments();
          if (values != null) {
          String str = values.getString("key", "");
          Toast.makeText(getActivity(), "接收Activity傳遞的至為:" + str, 0).show();

          } else {
          Toast.makeText(getActivity(), "接收Activity傳遞的至為空", 0).show();

          }

          return view;

          }
          }

          2.創(chuàng)建Fragment填充布局載體

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


          <FrameLayout
          android:id="@+id/fl_left"
          android:layout_width="0dp"
          android:layout_height="match_parent"
          android:layout_weight="1"
          android:background="#f00" />


          <FrameLayout
          android:id="@+id/fl_right"
          android:layout_width="0dp"
          android:layout_height="match_parent"
          android:layout_weight="2"
          android:background="#0f0" />


          LinearLayout>

          3.使用FragmentManager動(dòng)態(tài)填充

          1.創(chuàng)建容器接收Fragment 的Activity容器。
          2.使用FragmentManagerFragment進(jìn)行交互
          3.開啟事務(wù)將Fragment 填充到Activity 創(chuàng)建的容器中
          4.提交事務(wù)。

          public class FragmentAutoCreate extends Activity {
          @Override
          protected void onCreate(Bundle savedInstanceState) {
          // TODO Auto-generated method stub
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_fragment_autocreate);

          // 獲取fragmentManager --->開啟事務(wù)--->容器中填充內(nèi)容--->提交事務(wù)
          // FragmentManager : Activity 內(nèi)部用來與Fragment進(jìn)行交互的接口
          FragmentManager fragmentManager = getFragmentManager();
          // 開啟一個(gè)事務(wù)
          FragmentTransaction transaction = fragmentManager.beginTransaction();
          // 將左右兩側(cè)的Fragment 添加的R.id.fl_left 所代表的容器視圖中
          FragmentLeft leftFragment = new FragmentLeft();
          transaction.add(R.id.fl_left, leftFragment, "left_tag");
          // 1. 調(diào)用 Fragment 對外提供的方法
          leftFragment.setMsg("tttt");

          FragmentRight rightFragment = new FragmentRight();
          // 2. Activity --setArguments-> 創(chuàng)值給Fragment
          Bundle args = new Bundle();
          args.putString("key", "Activity --setArguments-> 創(chuàng)值給Fragment ");
          // 傳遞數(shù)據(jù)
          rightFragment.setArguments(args);
          transaction.add(R.id.fl_right, rightFragment);
          // transaction.replace(R.id.fl_right, rightFragment);
          // transaction.hide(rightFragment);
          transaction.show(rightFragment);

          // 提交事務(wù)
          transaction.commit();

          }

          public void test() {

          }
          }

          六、Activity 中獲取Fragment

                  Fragment idFragment=getFragmentManager().findFragmentById(R.id.fl_left);
          FragmentRight tagFragment = (FragmentRight) getFragmentManager().findFragmentByTag("left_tag");

          七、Fragment 獲取宿主Activity的方法

          1. getActivity()方法獲取宿主Activity

              public View onCreateView(LayoutInflater inflater, ViewGroup container,
          Bundle savedInstanceState) {
          Log.i(TAG, "----onCreateView----");
          // 將layout布局轉(zhuǎn)換成View
          View view = inflater.inflate(R.layout.fragment_left_layout, null);
          Toast.makeText(getActivity(),
          "通過對外提供方法setMsg(String msg),供Activity 調(diào)用", 0).show();
          return view;

          }

          八、兩個(gè)Fragment的通訊的方法

          1. 通過宿主Activity 到FragmentManger 方法獲取不同的Fragment

                  Fragment idFragment=getFragmentManager().findFragmentById(R.id.fl_left);
          FragmentRight tagFragment = (FragmentRight) getFragmentManager().findFragmentByTag("left_tag");

          九、Fragment 與 Activity通訊方法

          1.Activity 調(diào)用 setArguments 方法

          public class FragmentAutoCreate extends Activity {
          @Override
          protected void onCreate(Bundle savedInstanceState) {
          // TODO Auto-generated method stub
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_fragment_autocreate);

          // 獲取fragmentManager --->開啟事務(wù)--->容器中填充內(nèi)容--->提交事務(wù)
          // FragmentManager : Activity 內(nèi)部用來與Fragment進(jìn)行交互的接口
          FragmentManager fragmentManager = getFragmentManager();
          // 開啟一個(gè)事務(wù)
          FragmentTransaction transaction = fragmentManager.beginTransaction();
          // 將左右兩側(cè)的Fragment 添加的R.id.fl_left 所代表的容器視圖中
          FragmentLeft leftFragment = new FragmentLeft();
          transaction.add(R.id.fl_left, leftFragment, "left_tag");
          // 1. 調(diào)用 Fragment 對外提供的方法
          leftFragment.setMsg("tttt");

          FragmentRight rightFragment = new FragmentRight();
          // 2. Activity --setArguments-> 創(chuàng)值給Fragment
          Bundle args = new Bundle();
          args.putString("key", "Activity --setArguments-> 創(chuàng)值給Fragment ");
          // 傳遞數(shù)據(jù)
          rightFragment.setArguments(args);
          transaction.add(R.id.fl_right, rightFragment);
          // transaction.replace(R.id.fl_right, rightFragment);
          // transaction.hide(rightFragment);
          transaction.show(rightFragment);
          // 提交事務(wù)
          transaction.commit();
          }

          public void test() {
          }
          }

          2.通過Fragment 對外提供接口方法

          通過Fragment對外提供接口方法,供Activity調(diào)用

          public class FragmentLeft extends Fragment {

          private static final String TAG = " F wj";
          private String mMessage;

          public void setMsg(String msg) {
          this.mMessage = msg;
          }


          @Override
          public void onCreate(Bundle savedInstanceState) {
          Log.i(TAG, "----onCreate----");
          // 在Fragment 中調(diào)用Activity 中的方法
          ((FragmentAutoCreate) getActivity()).test();

          // TODO Auto-generated method stub
          super.onCreate(savedInstanceState);
          }

          @Override
          public View onCreateView(LayoutInflater inflater, ViewGroup container,
          Bundle savedInstanceState) {
          Log.i(TAG, "----onCreateView----");
          // 將layout布局轉(zhuǎn)換成View
          View view = inflater.inflate(R.layout.fragment_left_layout, null);
          Toast.makeText(getActivity(),
          "通過對外提供方法setMsg(String msg),供Activity 調(diào)用", 0).show();
          return view;

          }

          至此,本篇已結(jié)束。轉(zhuǎn)載網(wǎng)絡(luò)的文章,小編覺得很優(yōu)秀,歡迎點(diǎn)擊閱讀原文,支持原創(chuàng)作者,如有侵權(quán),懇請聯(lián)系小編刪除。同時(shí)感謝您的閱讀,期待您的關(guān)注。

          點(diǎn)個(gè)在看,方便您使用時(shí)快速查找!


          瀏覽 47
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  麻豆传媒换妻 | 一区二区三区四区精品视频 | 屁屁影院—线路①屁屁影院 | 日韩插插网| 人人操人人摸人人搞 |