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();
}
}