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

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

        这种情况就用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)
        }
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一个Activity实现多个覆盖全图的Fragment,可以使用FrameLayout或者RelativeLayout作为容器,并将多个Fragment添加进去。具体步骤如下: 1. 在布局文件中添加一个FrameLayout或RelativeLayout作为容器,设置其宽高为match_parent。 2. 在Activity中使用FragmentManager获取FragmentTransaction事务,然后通过add()方法将多个Fragment添加到容器中,需要注意的是,每个Fragment的布局中都需要设置宽高为match_parent。 3. 通过调用commit()方法使事务生效,此时多个Fragment将会覆盖全图显示在Activity中。 示例代码如下: activity_main.xml布局文件: ``` <RelativeLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` MainActivity.java代码: ``` public class MainActivity extends AppCompatActivity { private FragmentManager fragmentManager; private FragmentTransaction fragmentTransaction; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); fragmentManager = getSupportFragmentManager(); fragmentTransaction = fragmentManager.beginTransaction(); // 添加多个Fragment fragmentTransaction.add(R.id.container, new Fragment1()); fragmentTransaction.add(R.id.container, new Fragment2()); fragmentTransaction.add(R.id.container, new Fragment3()); fragmentTransaction.commit(); } } ``` Fragment1/Fragment2/Fragment3代码: ``` public class Fragment1 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_layout1, container, false); } } public class Fragment2 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_layout2, container, false); } } public class Fragment3 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_layout3, container, false); } } ``` 在上述示例中,Fragment1/Fragment2/Fragment3均为覆盖全图的Fragment。其中,fragment_layout1/fragment_layout2/fragment_layout3是三个布局文件,需要在其中设置宽高为match_parent。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值