参考:https://www.cnblogs.com/qlky/p/7210403.html
https://blog.csdn.net/shixianzuishuai/article/details/140906330
创建Fragment与创建Activity类似,开发者实现的Fragment必须继承Fragment基类。Android 9将原来的Fragment等基类都标记为过时,推荐使用support fragment下的Fragment,升级后的Fragment具有更好的适用性。
Android提供了如下的Fragment继承体系:开发者实现的Fragment可以根据需要继承上述Fragment基类或其任意子类。
实现Fragment与实现Activity非常相似,需要实现与Activity类似的回调方法,如onCreate()、onCreateView()、onStart()、onResume()、onPause()、onStop()等。
通常来说,创建Fragment需要实现如下三个方法:
onCreate(): 系统创建Fragment对象后回调该方法,用于初始化想要在Fragment中保持的必要组件。
onCreateView(): Fragment绘制界面组件时回调该方法,必须返回一个View,该View即为Fragment所显示的View。
onPause(): 用户离开Fragment时回调该方法。
为了控制Fragment显示的组件,通常需要重写onCreateView()方法,该方法返回的View将作为Fragment显示的组件。
Fragment的生命周期方法包括:
onAttach(): 当Fragment被添加到其所在的Context时回调。只会被调用一次。
onCreate(): 创建Fragment时回调。只会被调用一次。
onCreateView(): 每次创建、绘制Fragment的View组件时回调。必须返回一个View。
onActivityCreated(): 当Fragment所在的Activity启动完成后回调。
onStart(): 启动Fragment时回调。
onResume(): 恢复Fragment时回调。在onStart()方法后一定会回调onResume()。
onPause(): 暂停Fragment时回调。
onStop(): 停止Fragment时回调。
onDestroyView(): 销毁Fragment所包含的View组件时调用。
onDestroy(): 销毁Fragment时回调。只会被调用一次。
onDetach(): 将Fragment从其所在的Context中删除、替换完成时回调。在onDestroy()方法后一定会回调onDetach()方法。只会被调用一次。

示例代码:

package com.jay.myappstudy;

import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import com.jay.common.LocalDateTimeUtil;

public class FragmentTest1 extends Fragment {
    /**
     * 画面视图
     */
    private View mView;
    /**
     * 刷新按钮
     */
    private Button btnRefresh;
    /**
     * 展示文本
     */
    private TextView txtMsg;
    /**
     * 参数1
     */
    private String mPara1;
    /**
     * Fragment回调函数
     */
    private Callbacks mCallbacks;
    /**
     * 按钮事件
     */
    private View.OnClickListener clickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btnRefresh:
                    String nowStr = LocalDateTimeUtil.getNowString();
                    txtMsg.setText("当前时间:" + nowStr);
                    executeCallback(nowStr);
                    break;
                default:
                    txtMsg.setText("未知操作");
                    break;
            }
        }
    };

    public FragmentTest1() {
    }

    /**
     * 构造函数传参
     */
    public FragmentTest1(String para1) {
        this.mPara1 = para1;
    }

    public FragmentTest1(String para1, Callbacks callback) {
        this.mPara1 = para1;
        this.mCallbacks = callback;
    }

    /**
     * Fragment绘制界面组件时回调该方法,必须返回一个View,该View即为Fragment所显示的View。
     */
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        //return super.onCreateView(inflater, container, savedInstanceState);
        mView = inflater.inflate(R.layout.fragment_test_form1, container, false);
        //获取和设置视图中的控件
        if (mView != null) {
            btnRefresh = mView.findViewById(R.id.btnRefresh);
            txtMsg = mView.findViewById(R.id.txtMsg);
            btnRefresh.setOnClickListener(clickListener);
        }
        return mView;
    }

    /**
     * 创建Fragment时回调。只会被调用一次。
     * 系统创建Fragment对象后回调该方法,用于初始化想要在Fragment中保持的必要组件。
     */
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //获取启动Fragment时的参数
        String paraName = "para1";
        Bundle bundle = getArguments();
        if (bundle != null && bundle.containsKey(paraName)) {
            //获取Bundle中保存的参数,用来做后续操作,比如查询数据库。
            String para1Value = bundle.getString(paraName);
            Log.i("FragmentTest", "获取参数:" + para1Value);
        }
    }

    /**
     * 当Fragment被添加到其所在的Context时回调。只会被调用一次。
     * onAttach()方法的参数是一个Context对象,表示宿主Activity的上下文。
     * 通过该参数,Fragment可以获取到宿主Activity的引用,从而与宿主Activity进行通信和交互。
     */
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        //Fragment所在Activity集成实现回调接口函数,可以通过以下方式得到回调函数对象。
//        if (!(context instanceof Callbacks)) {
//            throw new IllegalStateException("Fragment所在的Activity必须实现Callbacks接口!");
//        }
//        mCallbacks = (Callbacks) context;
    }

    /**
     * 执行回调函数前可以执行Fragment本身相关逻辑。
     * */
    public void executeCallback(String para) {
        //回调之前的处理逻辑...
        //回调接口
        if (this.mCallbacks != null) {
            this.mCallbacks.onFragmentCallback(para);
        }
    }

    /**
     * 回调接口定义
     */
    public interface Callbacks {
        void onFragmentCallback(String para);
    }
}

Fragment布局代码

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/txtMsg"
        android:layout_width="match_parent"
        android:layout_height="20dp"
        android:text="点击按钮获取当前时间..."></TextView>

    <Button
        android:id="@+id/btnRefresh"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="当前时间"></Button>
</LinearLayout>

Activity调用

FragmentTest1 test1 = new FragmentTest1("abc", new FragmentTest1.Callbacks() {
    @Override
    public void onFragmentCallback(String para) {
        Log.i("IncludeFormActivity","从Fragment中接收到的回调参数:" + para);
    }
});
//创建Fragment时传参
Bundle paras = new Bundle();
paras.putString("para1","来自Activity的参数。");
test1.setArguments(paras);
//加载Fragment
openForm(test1);

加载和移除Fragment

    /**
     * 删除当前Activity中的所有Fragment
     * */
    private void closeAllForm(){
        FragmentManager fm = ctx.getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        //删除所有Fragment
        List<Fragment> fragments = fm.getFragments();
        if (fragments != null) {
            for (Fragment fra : fragments) {
                ft.remove(fra);
            }
        }
        ft.commit();
        fm.executePendingTransactions();
        fragments.clear();
        fm.getFragments().clear();
        fragments = fm.getFragments();
        if (fragments != null) {
            for (int i = 0; i < fragments.size(); i++) {
                ft.hide(fragments.get(i));
            }
        }
    }

    /**
     * 加载Fragment到当前Activity中
     * */
    private void openForm(Fragment fragment){
        FragmentActivity act = (FragmentActivity) ctx;
        FragmentManager fm = ctx.getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        ft.remove(fragment);
        //删除所有Fragment
        closeAllForm();
        List<Fragment> fragments = fm.getFragments();
        if (fragments != null) {
            for (int i = 0; i < fragments.size(); i++) {
                ft.hide(fragments.get(i));
            }
        }
        //Add Fragment 到容器中,可以是RelativeLayout或FrameLayout等容器。
        ft.add(R.id.mainContentArea, fragment);
        ft.show(fragment);
        ft.commit();
        fm.executePendingTransactions();
    }

 Activity画面布局

            <!-- 方式1:直接引入一个Fragment -->
            <fragment
                android:id="@+id/fmTest1"
                android:name="com.jay.myappstudy.FragmentTest1"
                android:layout_width="match_parent"
                android:layout_height="100dp"
                />
            <!-- 方式2:添加一个Layout容器,使用后台代码加载Fragment到这个容器中 -->
            <FrameLayout
                android:id="@+id/mainContentArea"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

 

posted on 2024-12-25 16:06  邢帅杰  阅读(97)  评论(0)    收藏  举报