Activity And Fragment

One Activity And several Fragment

Step1 CreateActivityInterface

public interface ActivityDelegate {
    void showSpecifiedFragment(Fragment fragment, String tag);

    <T extends DialogFragment> void showDialogFragment(T dialogFragment, String tag);
}

Step2 CreateActivity

creat activity to implements ActivityDelegate, this can be used to show different fragment. It is very important listen backStackChange.

package com.android.rxjava

import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager

/**
 * @author Zhou Liujian
 * @date 2023/4/3 17:26
 * @Mail zhouliujian@tp-link.com.hk
 */
class TestActivity : AppCompatActivity(), ActivityDelegate {


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

    }

    private fun init() {
        supportFragmentManager.addOnBackStackChangedListener(backStackChangedListener)
        //show first fragment
    }

    override fun showSpecifiedFragment(fragment: Fragment, tag: String) {
        val fragmentManager = supportFragmentManager
        if (fragment.isAdded) {
            fragmentManager.beginTransaction().show(fragment).commit()
        } else {
            fragmentManager.beginTransaction().add(R.id.content, fragment, tag).addToBackStack(tag)
                .commit()
        }
    }

    private val backStackChangedListener = object : FragmentManager.OnBackStackChangedListener {
        override fun onBackStackChanged() {
            val latestBackStackCount = supportFragmentManager.backStackEntryCount
            val fragment = getFragmentOnBackStackTop()
            //do for top fragment
        }
    }

    //get top fragment in backstack
    private fun getFragmentOnBackStackTop(): Fragment? {
        var fragment: Fragment? = null
        val fragmentManager = supportFragmentManager
        val backStackEntryCount = fragmentManager.backStackEntryCount
        if (backStackEntryCount > 0) {
            val fragmentTag =
                fragmentManager.getBackStackEntryAt(fragmentManager.backStackEntryCount - 1).name
            fragment = fragmentManager.findFragmentByTag(fragmentTag)
        }
        return fragment
    }

    override fun onBackPressed() {
        if (supportFragmentManager.backStackEntryCount > 1) {
            supportFragmentManager.popBackStackImmediate()
        } else {
            finish()
        }
    }
}

Step3 CreatFragment

Creat a fragment, in onAttach(), init activity delegate

package com.android.rxjava

import android.app.Activity
import android.content.Context
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment

/**
 * @author Zhou Liujian
 * @date 2023/4/3 17:38
 * @Mail zhouliujian@tp-link.com.hk
 */
class NewFragment: Fragment() , View.OnClickListener{

    
    private var activityDelegate: ActivityDelegate? = null

    override fun onAttach(context: Context) {
        super.onAttach(context)
        if (activity is ActivityDelegate) {
            activityDelegate = activity as ActivityDelegate
        }
    }
    
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return super.onCreateView(inflater, container, savedInstanceState)
    }
    
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
    }

    override fun onClick(v: View?) {
        when (v?.id) {
            R.id.text -> activityDelegate.showSpecifiedFragment(xxxFragmet, xxxFragmet.TAG)
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值