界面不显示问题

来源: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-backStackIndexdestid”
    }
    }

写回答

1回答

LovelyChubby

2020-04-22

构建fixfragmentnavigator对象得时候,是传递的childfragmentmanager吗?

0
4
LovelyChubby
回复
caifly
使用tools-layoutinspect分析一下布局看看。回退的问题,后面的课程中会讲到的
2020-06-11
共4条回复

开发商业级热门短视频App 掌握Jetpack组件库

Jetpack架构大揭秘,全组件实战主流且功能完整的短视频App

1364 学习 · 607 问题

查看课程