安卓Fragment代码示例

77 阅读5分钟

Activity生命周期:

  1. onCreate(Bundle savedInstanceState) :Activity 的创建阶段。在这里,您可以执行初始化操作,如设置布局、绑定视图、初始化变量等。通常,您还会检查传递给 onCreatesavedInstanceState,以查看是否需要还原之前的状态。
  2. onStart() :Activity 可见但不可交互。在这里,您可以执行一些初始化设置和准备工作。
  3. onResume() :Activity 可见且可交互。在这里,您通常会开始执行与用户交互相关的操作,如启动动画、开始传感器监听器等。
  4. onPause() :Activity 即将失去焦点,但仍可见。在这里,您通常会停止执行与用户交互相关的操作,以节省资源。
  5. onStop() :Activity 不再可见。在这里,您可以释放一些资源,停止处理后台任务,以及准备 Activity 进入后台状态。
  6. onSaveInstanceState(Bundle outState) :在 Activity 即将被销毁之前,用于保存当前状态的数据。这个方法允许您将数据保存到 Bundle 对象中,以便稍后在 onCreate 中恢复。
  7. onDestroy() :Activity 即将被销毁。在这里,您可以释放任何剩余的资源、取消监听器、取消未完成的任务等清理操作。
  8. onRestart() :Activity 重新启动。在这里,您可以执行一些重新初始化操作,以准备 Activity 进入 onStart 阶段。

Fragment生命周期

  1. onAttach(Context context) :Fragment 被附加到 Activity 时调用。在这里,您可以访问 Fragment 所属的 Activity,并执行一些初始化操作。
  2. onCreate(Bundle savedInstanceState) :在 Fragment 创建时调用。可以在这里进行一些初始化工作,但通常建议在这里只执行轻量级操作。savedInstanceState 参数用于恢复之前保存的状态。
  3. onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) :在此方法中,您应该创建 Fragment 的用户界面视图,并返回该视图。通常,您会使用 inflater 参数从 XML 布局文件中创建视图。
  4. onActivityCreated(Bundle savedInstanceState) :在与 Fragment 关联的 Activity 的 onCreate 方法完成后调用。可以在这里执行一些需要访问 Activity 上下文的操作。
  5. onStart() :Fragment 变得可见但尚未可交互时调用。通常,您会在这里初始化资源和准备数据。
  6. onResume() :Fragment 变得可见且可交互时调用。通常,您会在这里启动动画、开始监听事件等与用户交互相关的操作。
  7. onPause() :Fragment 即将失去焦点,但仍可见时调用。通常,您会在这里停止执行与用户交互相关的操作。
  8. onStop() :Fragment 不再可见时调用。您可以在这里释放资源、停止处理后台任务等。
  9. onDestroyView() :在 Fragment 的视图被销毁时调用。在这里,您可以清理与视图相关的资源,但 Fragment 实例本身仍然保留。
  10. onDestroy() :在 Fragment 即将被销毁时调用。通常,在这里执行最后的清理操作。
  11. onDetach() :在 Fragment 与 Activity 解除关联时调用。在这里,您可以执行最后的清理操作,并且不能再访问 Activity。

Fragment 是 Android 中的一种组件,它表示 Activity 的一部分用户界面或行为。Fragment 可以视为一个小型的子 Activity,它可以嵌入到 Activity 中,允许您构建更灵活和模块化的用户界面。Fragment 的主要作用包括:

  1. 模块化用户界面:Fragment 允许您将用户界面分成可重用的模块。这使得更容易构建适应不同屏幕尺寸和设备方向的应用程序。
  2. 多窗格用户界面:Fragment 可以用于构建支持平板电脑和大屏幕设备上的多窗格用户界面,其中多个 Fragment 可以同时显示在一个 Activity 中。
  3. 交互和通信:Fragment 可以与其宿主 Activity 以及其他 Fragment 进行通信。这使得在应用程序中的不同部分之间传递数据和触发操作变得容易。
  4. 生命周期管理:Fragment 具有自己的生命周期,与 Activity 的生命周期相似,可以处理各种生命周期事件,如创建、销毁、暂停和恢复。
  5. 动态添加和替换:您可以在运行时动态添加、替换和删除 Fragment,以响应用户操作或应用程序需求的变化。
  6. 适应屏幕方向和屏幕大小:通过使用 Fragment,您可以更容易地处理设备方向变化和不同屏幕大小的适配,从而提供更好的用户体验。

一、Fragment相关例子:

  1. 创建两个 Fragment 类。在项目中创建两个 Fragment 类,例如 FragmentAFragmentB
// FragmentA.java
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

public class FragmentA extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_a, container, false);
        
        // 添加按钮点击事件,用于替换到 FragmentB
        Button button = view.findViewById(R.id.buttonToB);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            
            public void onClick(View v) {
                MainActivity mainActivity = (MainActivity) getActivity();
                mainActivity.replaceFragment(new FragmentB());
            }
        });
        
        return view;
    }
}

// FragmentB.java
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

public class FragmentB extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_b, container, false);
        
        // 添加按钮点击事件,用于返回到 FragmentA
        Button button = view.findViewById(R.id.buttonToA);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MainActivity mainActivity = (MainActivity) getActivity();
                mainActivity.replaceFragment(new FragmentA());
            }
        });
        
        return view;
    }
}

  1. 创建布局文件来显示 Fragment 内容。在 res/layout 目录下创建两个布局文件,例如 fragment_a.xmlfragment_b.xml
<!-- fragment_a.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Fragment A"
        android:textSize="24sp" />

    <Button
        android:id="@+id/buttonToB"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Go to Fragment B" />
</LinearLayout>

<!-- fragment_b.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Fragment B"
        android:textSize="24sp" />

    <Button
        android:id="@+id/buttonToA"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Go to Fragment A" />
</LinearLayout>

  1. 创建一个 Activity 来托管这两个 Fragment。
// MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;

public class MainActivity extends AppCompatActivity {

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

        // 添加 FragmentA 到 activity_main.xml 中的 fragmentContainer
        addFragment(new FragmentA());
    }

    // 添加 Fragment
    public void addFragment(Fragment fragment) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.add(R.id.fragmentContainer, fragment);
        fragmentTransaction.commit();
    }

    // 替换 Fragment
    public void replaceFragment(Fragment fragment) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.fragmentContainer, fragment);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
    }
}

  1. activity_main.xml 布局文件中添加一个 FrameLayout 用于容纳 Fragment。
<!-- activity_main.xml -->
<FrameLayout
    android:id="@+id/fragmentContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

二、Fragment增加,替换,与删除:

import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

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

        // 添加 FragmentA 到 activity_main.xml 中的 fragmentContainer
        addFragment(new FragmentA());
    }

    // 添加 Fragment
    private void addFragment(Fragment fragment) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        
        // 用于将 Fragment 添加到容器中(fragmentContainer)
        fragmentTransaction.add(R.id.fragmentContainer, fragment);
        
        // 可选:添加到返回栈,以便可以通过返回按钮撤消操作
        fragmentTransaction.addToBackStack(null);
        
        fragmentTransaction.commit();
    }

    // 替换 Fragment
    private void replaceFragment(Fragment fragment) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        
        // 用于替换容器中的当前 Fragment
        fragmentTransaction.replace(R.id.fragmentContainer, fragment);
        
        // 可选:添加到返回栈
        fragmentTransaction.addToBackStack(null);
        
        fragmentTransaction.commit();
    }

    // 删除 Fragment
    private void removeFragment(Fragment fragment) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        
        // 用于从容器中删除 Fragment
        fragmentTransaction.remove(fragment);
        
        // 可选:添加到返回栈
        fragmentTransaction.addToBackStack(null);
        
        fragmentTransaction.commit();
    }

    // 示例:在按钮点击事件中添加一个新的 FragmentB
    public void onAddFragmentBClick(View view) {
        addFragment(new FragmentB());
    }

    // 示例:在按钮点击事件中替换当前 FragmentA 为 FragmentC
    public void onReplaceWithFragmentCClick(View view) {
        replaceFragment(new FragmentC());
    }

    // 示例:在按钮点击事件中删除当前 Fragment
    public void onRemoveFragmentClick(View view) {
        Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragmentContainer);
        if (fragment != null) {
            removeFragment(fragment);
        }
    }
}