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)
}
}
}