Android 中 Fragment 的使用指南
Fragment 是 Android 應用開發中的重要組件,它代表 Activity 中的一部分 UI 或行為,可以組合多個 Fragment 在一個 Activity 中構建多窗格 UI,并在不同 Activity 中重復使用某個 Fragment。
基本概念
Fragment 具有自己的生命周期,但依賴于宿主 Activity 的生命周期。每個 Fragment 都有自己的布局和行為。
創建 Fragment
1. 定義 Fragment 類
public class MyFragment extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// 膨脹 fragment 的布局return inflater.inflate(R.layout.fragment_my, container, false);}@Overridepublic void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);// 在這里初始化視圖和邏輯}
}
2. 創建 Fragment 的布局文件 (res/layout/fragment_my.xml)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello Fragment!" /></LinearLayout>
添加 Fragment 到 Activity
方式1: 在 XML 布局中添加 (靜態方式,不推薦)
<!-- activity_main.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><fragmentandroid:id="@+id/myFragment"android:name="com.example.MyFragment"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout>
方式2: 在代碼中動態添加 (推薦)
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 檢查是否已經添加了Fragment(防止旋轉時重復添加)if (savedInstanceState == null) {// 創建Fragment實例MyFragment fragment = new MyFragment();// 開始Fragment事務getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, fragment) // 添加到容器.commit();}}
}
對應的 activity_main.xml 需要有一個容器:
<FrameLayoutandroid:id="@+id/fragment_container"android:layout_width="match_parent"android:layout_height="match_parent" />
Fragment 事務
可以執行添加、移除、替換等操作:
// 替換Fragment
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new AnotherFragment()).addToBackStack(null) // 允許用戶按返回鍵返回上一個Fragment.commit();
Fragment 生命周期
Fragment 的生命周期方法:
onAttach()
- Fragment 與 Activity 關聯時調用onCreate()
- Fragment 創建時調用onCreateView()
- 創建 Fragment 的視圖層次結構onActivityCreated()
- Activity 的 onCreate() 完成后調用onStart()
- Fragment 可見時調用onResume()
- Fragment 可交互時調用onPause()
- Fragment 不再可交互時調用onStop()
- Fragment 不可見時調用onDestroyView()
- Fragment 的視圖被移除時調用onDestroy()
- Fragment 不再使用時調用onDetach()
- Fragment 與 Activity 解除關聯時調用
Fragment 與 Activity 通信
1. Fragment 調用 Activity 方法
// 在Fragment中
if (getActivity() instanceof MyActivityInterface) {((MyActivityInterface) getActivity()).doSomething();
}// Activity實現接口
public interface MyActivityInterface {void doSomething();
}
2. Activity 調用 Fragment 方法
MyFragment fragment = (MyFragment) getSupportFragmentManager().findFragmentById(R.id.my_fragment);
if (fragment != null) {fragment.doSomethingInFragment();
}
3. 使用 ViewModel 共享數據 (推薦)
// 創建共享ViewModel
public class SharedViewModel extends ViewModel {private final MutableLiveData<String> selected = new MutableLiveData<>();public void select(String item) {selected.setValue(item);}public LiveData<String> getSelected() {return selected;}
}// 在Activity或Fragment中獲取
SharedViewModel model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
model.getSelected().observe(this, item -> {// 更新UI
});
最佳實踐
- 使用
androidx.fragment.app
包中的 Fragment(支持庫版本) - 避免在 Fragment 中直接持有 Activity 的引用
- 使用接口進行 Fragment 與 Activity 的通信
- 考慮使用 ViewModel 和 LiveData 進行數據共享
- 合理使用
addToBackStack()
管理返回棧 - 為 Fragment 添加標簽,便于查找:
.add(R.id.container, fragment, "TAG")
高級用法
1. Fragment 參數傳遞
// 創建Fragment時傳遞參數
public static MyFragment newInstance(String param) {MyFragment fragment = new MyFragment();Bundle args = new Bundle();args.putString("key", param);fragment.setArguments(args);return fragment;
}// 在Fragment中獲取參數
@Override
public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (getArguments() != null) {String param = getArguments().getString("key");}
}
2. 使用 Navigation 組件管理 Fragment
// 在build.gradle中添加依賴
implementation "androidx.navigation:navigation-fragment:2.3.5"// 使用NavController導航
NavController navController = Navigation.findNavController(view);
navController.navigate(R.id.action_to_next_fragment);