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