一个Activity多个Fragment实现多步骤创建功能

该博客介绍了一种在Android开发中使用Fragment实现分步骤创建或编辑数据的方案。通过创建一个BaseStepFragment基类和实现OnFragmentInterationListener接口,可以方便地管理不同步骤间的跳转和数据传递。每个步骤的Fragment继承BaseStepFragment,并存储所需的数据Bean,从而实现在不同页面间保持数据的状态。最后,Activity负责处理Fragment之间的交互和跳转。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        实际开发中会遇到这种需求,就是创建或者新增一个东西(比如订单、计划什么的),产品给你的原型是分步骤的,每个步骤在不同的页面,可以上一步下一步,之前写过的内容返回还能显示,不同步骤之间数据可能还有控制关系,最后保存才会调用创建接口,完成创建或者保存的功能。

        这种情况就用fragment实现不同的步骤,然后写一个Bean类来存储所有的数据,每个fragment初始化的时候,都要设置页面数据,这样就能解决不同步骤之间的数据展示和控制了。

首先,定义一个BaseStepFragment,实现具体步骤的Fragment都继承这个BaseStepFragment

abstract class BaseStepFragment : Fragment() {

    public var mListener: OnFragmentInterationListener? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    override fun onAttach(context: Context) {
        super.onAttach(context)
        try {
            mListener = context as OnFragmentInterationListener
        } catch (e: ClassCastException){
            throw  ClassCastException(context.toString())
        }
    }

    //fragment不同步骤之间跳转
    public fun onButtonPressed(uri: String, param: StepFragmentBean?, animType: Int){
        if (null != mListener){
            mListener?.onFragmentInteraction(uri, param, animType)
        }
    }

    //这个监听让Activity实现具体的fragment之间的跳转
    interface OnFragmentInterationListener{
        public fun onFragmentInteraction(uri: String, param: StepFragmentBean?, animType: Int)
    }
}

Step1Fragment,Step2Fragment和Step3Fragment继承BaseStepFragment,下面只给出Step1Fragment接口,另外的思路都是一样的

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.EditText
import com.example.yuntest.FragmentStepActivity
import com.example.yuntest.R
import com.example.yuntest.bean.StepFragmentBean

class Step1Fragment(bean: StepFragmentBean?) : BaseStepFragment() {
    private var bean: StepFragmentBean? = null//这是保存数据的bean
    private lateinit var etParam1: EditText
    private lateinit var btnNext: Button
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view = inflater.inflate(R.layout.fragment_step1, container, false)
        btnNext = view.findViewById(R.id.btn_next)
        etParam1 = view.findViewById(R.id.et_param1)
        etParam1.setText(bean!!.param1)
        btnNext.setOnClickListener(this)
        return view
    }

    override fun onClick(view: View?) {
        super.onClick(view)
        when (view!!.id) {
            R.id.btn_next -> {
                val uri = FragmentStepActivity.STEP_2
                val param1 = etParam1!!.text.toString()
                bean!!.param1 = param1
                onButtonPressed(uri, bean, 1)
            }
        }
    }

    init {
        this.bean = bean
    }
}

FragmentStepActivity实现BaseStepFragment的OnFragmentInterationListener接口,实现fragment之间的跳转

import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentTransaction
import com.example.yuntest.bean.StepFragmentBean
import com.example.yuntest.databinding.ActivityFragmentStepBinding
import com.example.yuntest.view.BaseStepFragment
import com.example.yuntest.view.Step1Fragment
import com.example.yuntest.view.Step2Fragment
import com.example.yuntest.view.Step3Fragment

class FragmentStepActivity : AppCompatActivity(), BaseStepFragment.OnFragmentInterationListener, View.OnClickListener {

    private lateinit var mBinding: ActivityFragmentStepBinding
    protected lateinit var context: Context
    private lateinit var fragmentManager: FragmentManager

    companion object {
        const val STEP_1 = "step1"
        const val STEP_2 = "step2"
        const val STEP_3 = "step3"
        fun launch(context: Context) {
            context.startActivity(Intent(context, FragmentStepActivity::class.java))
        }

    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        context = this
        setContentView(R.layout.activity_fragment_step)
        mBinding = DataBindingUtil.setContentView<ActivityFragmentStepBinding>(this, R.layout.activity_fragment_step)
        addFragmentContent(Step1Fragment(StepFragmentBean()), 0)
    }

    fun addFragmentContent(frag: Fragment, animType: Int){
        fragmentManager = supportFragmentManager
        var localFragmentTransaction: FragmentTransaction = fragmentManager.beginTransaction()
        if (animType == 1){
            //下一步
            localFragmentTransaction.setCustomAnimations(R.anim.slide_right_in, R.anim.slide_left_out)
        }else if (animType == 2){
            //上一步
            localFragmentTransaction.setCustomAnimations(R.anim.slide_left_in, R.anim.slide_right_out)
        }
        localFragmentTransaction.replace(R.id.fl_content, frag)
        localFragmentTransaction.addToBackStack(null)
        localFragmentTransaction.commitAllowingStateLoss()

    }

    override fun onClick(v: View?) {
        when(v){

        }
    }

    override fun onFragmentInteraction(uri: String, param: StepFragmentBean?, animType: Int) {
        if (STEP_1.equals(uri)){
            addFragmentContent(Step1Fragment(param), animType)
        }else if (STEP_2.equals(uri)){
            addFragmentContent(Step2Fragment(param), animType)
        }else if (STEP_3.equals(uri)){
            addFragmentContent(Step3Fragment(param), animType)
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值