Fragment
外观
Fragment[编辑 | 编辑源代码]
Fragment(片段)是Android开发中的一种模块化UI组件,它可以作为Activity的一部分存在,拥有自己的生命周期和用户界面。Fragment允许开发者将UI分解为独立的可重用模块,从而在不同屏幕尺寸和设备上实现更灵活的界面布局。
概述[编辑 | 编辑源代码]
Fragment首次在Android 3.0(API级别11)中引入,主要目的是:
- 支持更复杂的用户界面设计
- 实现UI组件在不同Activity中的复用
- 更好地适应平板电脑等大屏幕设备
- 简化动态UI的创建和管理
Fragment必须始终嵌入在Activity中运行,其生命周期直接受宿主Activity的影响。
生命周期[编辑 | 编辑源代码]
Fragment的生命周期比Activity更复杂,包含以下主要状态:
基本用法[编辑 | 编辑源代码]
创建Fragment[编辑 | 编辑源代码]
public class ExampleFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
// 膨胀Fragment的布局
return inflater.inflate(R.layout.example_fragment,
container, false);
}
}
在Activity中添加Fragment[编辑 | 编辑源代码]
可以通过XML静态添加或Java代码动态添加:
XML方式[编辑 | 编辑源代码]
<fragment
android:name="com.example.ExampleFragment"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Java方式[编辑 | 编辑源代码]
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.add(R.id.fragment_container, new ExampleFragment());
transaction.commit();
通信机制[编辑 | 编辑源代码]
Fragment与宿主Activity及其他Fragment的通信方式:
1. **通过Activity中转**:
- Fragment可以通过getActivity()获取宿主Activity实例 - Activity可以通过FragmentManager.findFragmentById()获取Fragment实例
2. **使用接口回调**:
// 在Fragment中定义接口
public interface OnItemSelectedListener {
void onItemSelected(String item);
}
// Activity实现该接口
public class MainActivity extends AppCompatActivity
implements ExampleFragment.OnItemSelectedListener {
@Override
public void onItemSelected(String item) {
// 处理选择事件
}
}
3. **使用ViewModel**(推荐用于复杂数据共享)
实际应用案例[编辑 | 编辑源代码]
响应式布局[编辑 | 编辑源代码]
在平板设备上,可以使用多个Fragment实现主从布局:
- 左侧Fragment显示列表
- 右侧Fragment显示详情
- 在手机上则分屏显示
ViewPager实现滑动标签页[编辑 | 编辑源代码]
结合ViewPager2和FragmentStateAdapter可以创建可滑动的标签界面:
public class ScreenSlidePagerActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_screen_slide);
ViewPager2 viewPager = findViewById(R.id.pager);
viewPager.setAdapter(new ScreenSlidePagerAdapter(this));
}
}
private class ScreenSlidePagerAdapter extends FragmentStateAdapter {
public ScreenSlidePagerAdapter(FragmentActivity fa) {
super(fa);
}
@Override
public Fragment createFragment(int position) {
return new ScreenSlidePageFragment();
}
@Override
public int getItemCount() {
return 5; // 页数
}
}
最佳实践[编辑 | 编辑源代码]
1. 避免在Fragment中直接持有Activity的强引用 2. 使用setArguments()传递初始数据 3. 考虑使用Navigation组件管理Fragment导航 4. 正确处理配置变更(如屏幕旋转) 5. 对耗时操作使用Loader或ViewModel
参见[编辑 | 编辑源代码]
- Activity - Fragment的宿主组件
- ViewPager2 - 常用于结合Fragment实现滑动界面
- ViewModel - 推荐的数据共享方式
- Android Jetpack - 包含Fragment相关的最新开发工具