Fragment碎片

什麼是Fragment?

在應用開發過程中,我們常常會遇到這樣的需求:在屏幕上單擊某個按鈕顯示其內容,我們可以通過Activity跳轉實現,但是這樣做消耗手機資源而且實現繁瑣,還要考慮各種可能出現的bug,所以我在開發中優選Fragment。我們可以把Fragment看作是一個小的Activity或者是Activity的一個片段,通過Fragment我們可以將屏幕任意地分割成我們需要地佈局樣式,進行模塊化、碎片化地管理每個Fragment裏的內容,從而可以更加方便的在 運行過程中動態地更新Activity的用戶界面!另外Fragment並不能單獨使用,它需要被嵌套在Activity中使用,Fragment擁有自己的生命週期,但是還是會受到宿主Activity的生命週期的影響,Activity 被銷燬了,他也會跟着銷燬。

Fragment的優勢

模塊化(Modularity):我們不必把所有代碼全部寫在Activity中,而是把代碼寫在各自的Fragment中。
可重用(Reusability):多個Activity可以重用一個Fragment。
可適配(Adaptability):根據硬件的屏幕尺寸、屏幕方向,能夠方便地實現不同的佈局,這樣用戶體驗更好。

創建一個Fragment

(1).定義一個類, 繼承Fragment
(2).重寫父類的方法onCreateView()
(3).在onCreateView()方法中, 爲Fragment 創建UI界面
    或右鍵新建一個Fragment

加載Fragment的兩種方式

靜態加載fragment

java文檔:

/**
 * A simple {@link Fragment} subclass.
 */
public class SecondFragment extends Fragment {


    public SecondFragment() {
        // Required empty public constructor
    }


    //創建Fragment視圖
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        Log.i("---", "onCreateView: ");
        return  inflater.inflate(R.layout.fragment_second, container, false);
    }

}

layout佈局:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"
    tools:context=".FristFragment">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="第二個Fragment" />
</FrameLayout>

在activity_main.xml中靜態加載佈局:

 <!--一定要注意的是:name屬性是fragment的全限定名-->
    <fragment
        android:id="@+id/second_fragment"
        android:name="com.example.highday4_2_24.SecondFragment"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    </fragment>

動態加載fragment

首先動態加載需要一個工具叫FragmentManager

下面是創建FragmentManager的步驟以及常見方法介紹

private void addFragment(Fragment fragment) {
    //創建管理者
    FragmentManager supportFragmentManager = getSupportFragmentManager();
    //開啓事務
    FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction();
    //add方法參數,第一個要放入的容器(佈局的Id),第二個是fragment對象
    fragmentTransaction.add(R.id.fl,new Fragment);
    //replace(替換一個佈局)執行過程是先 remove 然後在 add.
    fragmentTransaction.replace(R.id.fl,fragment);
    //移除一個Fragment
    fragmentTransaction.remove(fragment);
    //隱藏一個Fragment
    fragmentTransaction.hide(fragment);
    //提交事務
    fragmentTransaction.commit();
}

Fragment生命週期

在這裏插入圖片描述

//創建Fragment視圖
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    Log.i("---", "onCreateView: ");
    View view = inflater.inflate(R.layout.fragment_frist, container, false);
    return view;
}

//創建Fragment
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    Log.i("---", "onCreate: ");
    super.onCreate(savedInstanceState);
}

//Fragment與Activity有聯繫
@Override
public void onAttach(@NonNull Context context) {
    Log.i("---", "onAttach: ");
    super.onAttach(context);
}

//當Activity中的onCreate方法執行完後調用
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    Log.i("---", "onActivityCreated: ");
    super.onActivityCreated(savedInstanceState);
}

//啓動Fragment
@Override
public void onStart() {
    Log.i("---", "onStart: ");
    super.onStart();
}

//Fragment可見
@Override
public void onResume() {
    Log.i("---", "onResume: ");
    super.onResume();
}

//Fragment不可見
@Override
public void onPause() {
    Log.i("---", "onPause: ");
    super.onPause();
}

//停止Fragment
@Override
public void onStop() {
    Log.i("---", "onStop: ");
    super.onStop();
}

//銷燬Fragment視圖
@Override
public void onDestroyView() {
    Log.i("---", "onDestroyView: ");
    super.onDestroyView();
}

//銷燬Fragment對象
@Override
public void onDestroy() {
    Log.i("---", "onDestroy: ");
    super.onDestroy();
}

//Fragment和Activity解除關聯的時候調用
@Override
public void onDetach() {
    Log.i("---", "onDetach: ");
    super.onDetach();
}

Fragment簡單實現

做兩個按鈕,實現點擊不同按鈕觸發不同的Fragment

public class MainActivity extends AppCompatActivity {
    private Button btn1;
    private Button btn2;

    private FristFragment fristFragment = new FristFragment();
    private SecondFragment secondFragment = new SecondFragment();

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


        btn1 = (Button) findViewById(R.id.btn_1);
        btn2 = (Button) findViewById(R.id.btn_2);

        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                addFragment(fristFragment);
            }
        });

        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                addFragment(secondFragment);
            }
        });
    }

    private void addFragment(Fragment fragment) {
        //創建管理者
        FragmentManager supportFragmentManager = getSupportFragmentManager();
        //開啓事務
        FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction();
        //提交事務
        fragmentTransaction.replace(R.id.fl,fragment);
        fragmentTransaction.commit();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章