参考: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" />
浙公网安备 33010602011771号