详解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日

相关文章

  • Android自定义悬浮按钮效果

    Android自定义悬浮按钮效果 在手机应用开发中,悬浮按钮已经成为了流行的用户界面元素。悬浮按钮可以通过相应的手势实现一些应用操作,比如向上滑动打开应用菜单、向下滑动隐藏悬浮按钮等等。本文将介绍如何使用Android SDK来自定义悬浮按钮效果。 步骤1:创建悬浮按钮控件 为了实现悬浮按钮的效果,需要创建自定义的View控件。下面是一个简单的悬浮按钮控件代…

    other 2023年6月25日
    00
  • 使用powershell启用/关闭windows功能

    使用PowerShell启用/关闭Windows功能 Windows提供了许多可以通过控制面板启用或关闭的功能,例如Hyper-V虚拟化、PowerShell Remoting、.NET Framework等等。但是有些时候,我们需要在脚本或批处理中进行这些更改,这时我们可以使用PowerShell来启用或关闭Windows功能。 启用Windows功能 首…

    其他 2023年3月28日
    00
  • Vue中的slot使用插槽分发内容的方法

    当在Vue中使用插槽时,可以通过插槽分发内容的方法来实现更灵活的组件复用。下面是使用插槽的完整攻略: 步骤1:定义插槽 首先,在组件的模板中定义插槽。可以使用<slot>元素来创建一个插槽,并为其指定一个名称。例如,以下代码定义了一个名为\”header\”的插槽: <template> <div> <slot na…

    other 2023年8月21日
    00
  • Android Handler内存泄漏详解及其解决方案

    下面我将详细讲解 Android Handler 内存泄漏的问题及其解决方案。 什么是 Android Handler? Handler 是 Android 中的一个消息处理机制,允许你在不同线程之间传递和处理消息。可以使用 Handler 在 Android 程序的主线程和其他的线程之间进行通信,避免了多线程同时访问 UI 界面时的问题。 Handler …

    other 2023年6月26日
    00
  • 魔兽世界wlk怀旧服兽王猎堆什么属性 兽王猎属性优先级选择推荐

    魔兽世界wlk怀旧服兽王猎堆什么属性 在魔兽世界wlk怀旧服中,兽王猎是一个非常强大的职业之一。在装备选择方面,合理的选择属性可以让兽王猎变得更加强大。下面我们将为大家详细讲解兽王猎堆什么属性以及属性的优先级选择推荐。 属性选择 兽王猎需要关注的属性主要有以下几点: 1. 敏捷 敏捷是兽王猎最为重要的属性,因为它可以提高攻击强度和暴击几率。在装备选择时,需要…

    other 2023年6月27日
    00
  • ubuntu17.10右键菜单怎么添加新建word文档选项?

    若想在Ubuntu17.10中右键菜单添加新建Word文档选项,可以按照以下步骤进行操作: 安装LibreOffice Writer 在Ubuntu 17.10中默认已经集成了LibreOffice Writer,如果没有安装该软件,可以在终端中输入以下命令进行安装: sudo apt-get install libreoffice-writer 创建脚本文…

    other 2023年6月27日
    00
  • Ruby 中$开头的全局变量、内部变量、隐藏变量介绍

    Ruby 中$开头的全局变量、内部变量、隐藏变量介绍 在Ruby中,以$开头的变量被称为全局变量。全局变量可以在程序的任何地方访问,包括方法内部和类定义中。下面是全局变量的两个示例: $LOAD_PATH:这是一个包含Ruby加载路径的全局变量。它是一个数组,包含了Ruby查找文件时要搜索的目录列表。可以通过修改这个变量来添加或删除加载路径。例如: ruby…

    other 2023年7月29日
    00
  • python学习Selenium介绍及安装部署详解

    Python学习Selenium介绍及安装部署详解 什么是Selenium Selenium是一个用于自动化浏览器操作的工具,支持多种浏览器,如Chrome、Firefox等。它可以模拟用户的行为,例如点击按钮、输入文本、提交表单等。 为何要学习Selenium Selenium在Web开发中有着广泛的应用,可以帮助我们完成一些自动化测试、自动化填表、自动化…

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