跳转到内容

Fragment

来自代码酷

Fragment[编辑 | 编辑源代码]

Fragment(片段)是Android开发中的一种模块化UI组件,它可以作为Activity的一部分存在,拥有自己的生命周期和用户界面。Fragment允许开发者将UI分解为独立的可重用模块,从而在不同屏幕尺寸和设备上实现更灵活的界面布局。

概述[编辑 | 编辑源代码]

Fragment首次在Android 3.0(API级别11)中引入,主要目的是:

  • 支持更复杂的用户界面设计
  • 实现UI组件在不同Activity中的复用
  • 更好地适应平板电脑等大屏幕设备
  • 简化动态UI的创建和管理

Fragment必须始终嵌入在Activity中运行,其生命周期直接受宿主Activity的影响。

生命周期[编辑 | 编辑源代码]

Fragment的生命周期比Activity更复杂,包含以下主要状态:

stateDiagram-v2 [*] --> Attached Attached --> Created: onAttach() Created --> ViewCreated: onCreateView() ViewCreated --> Started: onViewCreated() Started --> Resumed: onStart() Resumed --> Paused: onResume() Paused --> Stopped: onPause() Stopped --> ViewDestroyed: onStop() ViewDestroyed --> Destroyed: onDestroyView() Destroyed --> Detached: onDestroy() Detached --> [*]: onDetach()

基本用法[编辑 | 编辑源代码]

创建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

参见[编辑 | 编辑源代码]