界面不显示问题
来源:3-6 app定制Fragment导航器

caifly
2020-04-22
老师好,我按您的代码写了,只是使用了kotlin语言,程序运行没问题,但我使用FixFragmentNavigator界面不显示,onCreateView方法也执行了,不使用就可以。点几下菜单也不显示,按回退键界面显示了,但都重叠在一起了。请问这是什么问题,如果解决。感觉就是Fragment起始给hide了,可代码里明明是show了,搞不懂问题出在哪里
代码如下:请帮忙看看问题在哪里。
package pjy.caiflyy.food.navigator
import android.content.Context
import android.os.Bundle
import android.util.Log
import androidx.annotation.IdRes
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.navigation.NavDestination
import androidx.navigation.NavOptions
import androidx.navigation.Navigator
import androidx.navigation.fragment.FragmentNavigator
import java.lang.reflect.Field
import java.util.*
/**
-
自定义Fragment导航器
*/
@Navigator.Name(“fixfragment”)
class FixFragmentNavigator(
val context: Context,
val fragmentManager: FragmentManager,
val containerId: Int
) : FragmentNavigator(
context,
fragmentManager,
containerId
) {
override fun navigate(
destination: Destination,
args: Bundle?,
navOptions: NavOptions?,
navigatorExtras: Navigator.Extras?
): NavDestination? {
if (fragmentManager.isStateSaved) {
Log.i(
“MyLog”, “Ignoring navigate() call: FragmentManager has already”
+ " saved its state"
)
return null
}
var className = destination.className
if (className[0] == ‘.’) {
className = context.packageName + className
}
val tag = className.substring(className.lastIndexOf(".") + 1)
val frag = instantiateFragment(
context, fragmentManager,
className, args
)
frag.arguments = args
val ft = fragmentManager.beginTransaction()var enterAnim = navOptions?.enterAnim ?: -1 var exitAnim = navOptions?.exitAnim ?: -1 var popEnterAnim = navOptions?.popEnterAnim ?: -1 var popExitAnim = navOptions?.popExitAnim ?: -1 if (enterAnim != -1 || exitAnim != -1 || popEnterAnim != -1 || popExitAnim != -1) { enterAnim = if (enterAnim != -1) enterAnim else 0 exitAnim = if (exitAnim != -1) exitAnim else 0 popEnterAnim = if (popEnterAnim != -1) popEnterAnim else 0 popExitAnim = if (popExitAnim != -1) popExitAnim else 0 ft.setCustomAnimations(enterAnim, exitAnim, popEnterAnim, popExitAnim) } val fragments: List<Fragment> = fragmentManager.fragments for (fragment in fragments) { ft.hide(fragment) } if (!frag.isAdded) { ft.add(containerId, frag, tag) } ft.show(frag) ft.setPrimaryNavigationFragment(frag) val field: Field = FragmentNavigator::class.java.getDeclaredField("mBackStack") field.setAccessible(true) val mBackStack = field.get(this) as ArrayDeque<Int?> @IdRes val destId = destination.id val initialNavigation = mBackStack.isEmpty() val isSingleTopReplacement = (navOptions != null && !initialNavigation && navOptions.shouldLaunchSingleTop() && mBackStack.peekLast() == destId) val isAdded: Boolean isAdded = when { initialNavigation -> { true } isSingleTopReplacement -> { // Single Top means we only want one instance on the back stack if (mBackStack.size > 1) { // If the Fragment to be replaced is on the FragmentManager's // back stack, a simple replace() isn't enough so we // remove it from the back stack and put our replacement // on the back stack in its place fragmentManager.popBackStack( generateBackStackName(mBackStack.size, mBackStack.peekLast()!!), FragmentManager.POP_BACK_STACK_INCLUSIVE ) ft.addToBackStack(generateBackStackName(mBackStack.size, destId)) } false } else -> { ft.addToBackStack(generateBackStackName(mBackStack.size + 1, destId)) true } } if (navigatorExtras is Extras) { for ((key, value) in navigatorExtras.sharedElements) { ft.addSharedElement(key!!, value!!) } } ft.setReorderingAllowed(true) ft.commit() return if (isAdded) { mBackStack.add(destId) destination } else { null }
}
private fun generateBackStackName(backStackIndex: Int, destid: Int): String? {
return “backStackIndex−backStackIndex-backStackIndex−destid”
}
}
1回答
-
LovelyChubby
2020-04-22
构建fixfragmentnavigator对象得时候,是传递的childfragmentmanager吗?
042020-06-11
相似问题