详解Android中Fragment的两种创建方式

一、Fragment的概述

Fragment是Android中的一种UI组件,可以被称为“Activity的子Activity”,因为一个Activity可以有多个Fragment,Fragment可以嵌套在Activity的布局中,且可以动态加载、替换、添加、删除等操作。

二、Fragment的创建方式

在Android中,Fragment有两种创建方式:静态创建方式和动态创建方式。

1. 静态创建方式

静态创建方式即在xml布局中直接定义Fragment,可以在Activity的xml布局文件中通过标签定义:

<fragment
    android:name="com.example.fragmentdemo.Fragment1"
    android:id="@+id/fragment1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

其中,android:name属性指定Fragment的类名,android:id属性用于在Java代码中找到这个Fragment,其他属性用于指定布局大小、位置等。

2. 动态创建方式

动态创建方式是指通过Java代码动态创建Fragment,一般需要在Activity的onCreate()方法中调用FragmentManager的方式来实现。

创建步骤如下:

  1. 创建Fragment类
  2. 创建Fragment的布局文件
  3. 在Activity中创建FragmentManager对象
  4. 创建FragmentTransaction对象
  5. 绑定Fragment和布局文件
  6. 提交FragmentTransaction

示例1:

public class MainActivity extends AppCompatActivity {

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

        Fragment1 fragment1 = new Fragment1();
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.add(R.id.fragment_container, fragment1);
        transaction.commit();
    }
}

在这个示例中,我们首先创建了一个Fragment1的对象,然后获取Activity的FragmentManager对象,创建FragmentTransaction对象,接着我们绑定了Fragment1和布局文件,最后提交了Transaction。

3. Fragment的生命周期

关于Fragment生命周期,大家可以参考官方文档,这里不再展开说明。

三、总结

本文介绍了Android中Fragment的两种创建方式,分别是静态创建方式和动态创建方式,介绍了它们的使用方法以及示例代码,并提供了对应的布局文件。当然,我们也简述了Fragment的生命周期。

示例2:

public class MainActivity extends AppCompatActivity {
    Fragment2 fragment2;

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

        fragment2 = Fragment2.newInstance("fragment参数");
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.add(R.id.fragment_container, fragment2);
        transaction.commit();
    }

    /**
     * 通过接口回调获取fragment2的参数值
     * @param str
     */
    public void getValueFromFragment(String str){
        Toast.makeText(this, "来自Fragment的参数值:"+str, Toast.LENGTH_SHORT).show();
    }
}

public class Fragment2 extends Fragment {
    private static final String ARG_PARAM = "param";
    private String mParam;

    private OnFragmentInteractionListener mListener;

    public Fragment2() {
        // Required empty public constructor
    }

    public static Fragment2 newInstance(String param) {
        Fragment2 fragment = new Fragment2();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM, param);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam = getArguments().getString(ARG_PARAM);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_fragment2, container, false);
        TextView textView = view.findViewById(R.id.tv_frag);
        textView.setText(mParam);

        Button button = view.findViewById(R.id.btn_to_activity);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mListener!=null){
                    mListener.onFragmentInteraction("来自Fragment的参数值:动态创建+接口回调");
                }
            }
        });

        return view;
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof OnFragmentInteractionListener) {
            mListener = (OnFragmentInteractionListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    public interface OnFragmentInteractionListener {
        void onFragmentInteraction(String str);
    }
}

在这个示例中,我们通过newInstance()方法传递了fragment的参数,然后我们在Fragment中动态的显示该参数,此外我们还通过interface定义了一个接口回调,将fragment的参数值传回到了Activity中。

以上就是关于Android中Fragment的两种创建方式详细讲解,希望对大家了解Fragment有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Android中Fragment的两种创建方式 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 原生Vue 实现右键菜单组件功能

    下面是详细的“原生Vue 实现右键菜单组件功能”的攻略: 1. 准备工作 要实现右键菜单组件,我们首先要准备好 Vue 以及相关依赖包,这里我以安装 Vue 3.x 版本为例。 在控制台运行以下命令: npm install vue@next 另外,我们需要使用 popper.js 依赖库来实现菜单的弹出和定位,通过以下命令安装: npm install @…

    other 2023年6月27日
    00
  • 安装calico

    安装Calico是一种网络解决方案,用于在Kubernetes集群中实现网络和安全策略。以下是安装Calico的完整攻略: 安装etcd Calico需要etcd作为其数据存储后端。可以使用以下命令安装etcd: bash sudo apt-get update sudo apt-get install etcd 安装Calico 可以使用以下命令安装Cal…

    other 2023年5月7日
    00
  • 详解Mybatis核心配置文件

    下面就给您详细讲解Mybatis核心配置文件的完整攻略。 什么是Mybatis核心配置文件 Mybatis核心配置文件是Mybatis框架的重要组成部分,主要用于对数据源、缓存、事务、日志等核心功能的配置。 Mybatis核心配置文件的结构 Mybatis核心配置文件的结构如下所示: <?xml version="1.0" enco…

    other 2023年6月25日
    00
  • Angular中使用嵌套Form的详细步骤

    Angular中使用嵌套Form的详细步骤 在Angular中,使用嵌套表单可以更好地组织和管理复杂的表单结构。下面是使用嵌套表单的详细步骤: 步骤1:导入必要的模块 首先,确保你的Angular项目中已经导入了ReactiveFormsModule模块。在你的模块文件(通常是app.module.ts)中添加以下代码: import { ReactiveF…

    other 2023年7月28日
    00
  • react获取url参数的方法

    以下是React获取URL参数的完整攻略,包括步骤、示例和注意事项: React获取URL参数的方法攻略 在React中,我们可以使用JavaScript来获取URL参数以下是详细的攻略: 步骤 以下是获取URL参数的步骤: 获取URL。 在React中,我们可以使用window.location.href获取当前页面的URL。 解析URL参数。 在获取UR…

    other 2023年5月7日
    00
  • 使用React Hooks模拟生命周期的实现方法

    使用React Hooks模拟生命周期的实现方法主要包括以下几个步骤: 1. 导入Hooks 首先需要在组件中导入需要使用的React Hooks,通常包括useState、useEffect等。 import React, { useState, useEffect } from ‘react’; 2. 使用useState创建状态 使用useState …

    other 2023年6月27日
    00
  • Android5.0新控件实例详解

    Android5.0新控件实例详解 介绍 Android 5.0 在控件层面做了不少的更新,引入了 Material Design 设计风格并提供了一些新的控件供我们使用。这些控件功能更加完善、外观更加美观、可配置项更丰富,为我们提供了更优秀、更强大的开发工具。 这篇文章将会讲解 Android 5.0 新控件的各种使用方式,并提供多个实例进行详解,帮助 A…

    other 2023年6月27日
    00
  • 易语言实现反OD调试反复附加的代码

    易语言实现反OD调试反复附加的代码攻略 介绍 在软件开发中,为了保护自己的代码不被逆向工程或调试工具破解,我们可以使用一些反调试的技术。本攻略将介绍如何使用易语言来实现反OD调试反复附加的代码。 步骤 步骤一:检测调试器 为了实现反OD调试反复附加的代码,首先需要检测当前程序是否正在被调试器调试。我们可以使用Windows的API函数来实现这一功能。 #de…

    other 2023年6月28日
    00
合作推广
合作推广
分享本页
返回顶部