标签: android-navigation

尝试在 onDestoryView() 之外保留 Fragment 视图的引用时发生内存泄漏

我想从FragmentA (RootFragment)转到FragmentB但我不想在 FragmentB 返回后重新创建 FragmentA 的视图。

我正在使用 Jetpack Navigation 在 Fragment 之间导航。

为了实现上述目标,我有一个像这样的片段 Fragment:

class RootFragment : DaggerFragment() {
    private var viewToRestore: View? = null


    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
        return if (viewToRestore != null) {
            viewToRestore!!
        } else {
            return inflater.inflate(R.layout.fragment_root, parent, false)
        }
    }

    override fun onDestroyView() {
        viewToRestore = this.view
        super.onDestroyView()
    }

    override fun onDestroy() {
        super.onDestroy()
    }    
}
Run Code Online (Sandbox Code Playgroud)

但是,一旦我到达具有属性viewToRestore 的Fragment BFragmentA (RootFragment) 就会泄漏。 …

android memory-leaks android-fragments android-navigation leakcanary

3
推荐指数
1
解决办法
1242
查看次数

Navigation.findNavController(Activity, @IdRes int viewId) 中的第二个参数是什么

学习这个并阅读文档我无法理解我应该放什么viewId

Navigation.findNavController(Activity, @IdRes int viewId)
Run Code Online (Sandbox Code Playgroud)

我为导航架构组件做了Codelab,但那是 Kotlin 代码。我需要Java。

android android-navigation

3
推荐指数
1
解决办法
1270
查看次数

导航 popBackStack 禁止进一步导航到该 Fragment

Navigation我在使用带有此代码的组件时加载片段,并且它有效。

findNavController().navigate(R.id.menu_nav_graph, bundleOf("menuItem" to item))
Run Code Online (Sandbox Code Playgroud)

我想在单击按钮时关闭片段,我使用此代码

findNavController().popBackStack()
Run Code Online (Sandbox Code Playgroud)

应用程序导航到上一个片段,但是当我尝试使用上面的代码再次导航到弹出的片段目的地时,应用程序到达代码但没有任何反应。片段未加载。因此,导航代码已执行,但片段未打开。popBackStack当我不使用它与 onClick 监听器一起使用时,也会发生同样的情况

activity?.onBackPressed()
Run Code Online (Sandbox Code Playgroud)

同样的效果,应用程序到达导航线,没有崩溃,没有抛出异常,只是没有打开 Fragment。

同时,我的后退箭头导航正在工作,并且在从片段按回后,它确实多次转到同一目的地。这让我感到困惑,因为我使用相同的代码并且onOptionsItemSelected它可以工作,所以我不明白当我只调用onBackPressed()按钮单击时它有何不同。

override fun onOptionsItemSelected(item: MenuItem): Boolean =
        when (item.itemId) {
            android.R.id.home -> {
                activity?.onBackPressed()
                true
            }
            else -> super.onOptionsItemSelected(item)
        }
Run Code Online (Sandbox Code Playgroud)

如何在单击按钮时关闭片段并能够导航到相同的目的地?

navigation android android-fragments android-navigation android-jetpack

3
推荐指数
1
解决办法
1292
查看次数

在导航中使用 TypeSafe 将多个参数传递给片段

我知道可以在源片段中使用 Action 传递单个参数

  override fun onClick(v: View) {
       val amountTv: EditText = view!!.findViewById(R.id.editTextAmount)
       val amount = amountTv.text.toString().toInt()
       val action = SpecifyAmountFragmentDirections.confirmationAction(amount)
       v.findNavController().navigate(action)

}
Run Code Online (Sandbox Code Playgroud)

并按照 android 文档中指定的方式在目标片段中获取它

    val args: ConfirmationFragmentArgs by navArgs()
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            val tv: TextView = view.findViewById(R.id.textViewAmount)
            val amount = args.amount
            tv.text = amount.toString()
}
Run Code Online (Sandbox Code Playgroud)

请让我知道是否有任何方法可以以 TypeSafe 方式传递多个参数

android android-navigation android-architecture-components android-jetpack

3
推荐指数
1
解决办法
4222
查看次数

androidx.navigation 库更新到 2.2.2 版本发布构建问题

我有 androidx.navigation 上次更新的问题

我注意到,如果构建是RELEASE ,则在新更新(2.2.2) 后崩溃,错误如下

Caused by: android.view.InflateException: Binary XML file line #12 in 
com.somedomain.android:layout/activity_main: Binary XML file line #12 in 
com.somedomain.android:layout/activity_main: Error inflating class 
androidx.fragment.app.FragmentContainerView


Caused by: android.view.InflateException: Binary XML file line #12 in 
com.somedomain.android:layout/activity_main: Error inflating class 
androidx.fragment.app.FragmentContainerView

androidx.fragment.app.Fragment$e: Unable to instantiate fragment 
androidx.navigation.fragment.NavHostFragment: make sure class name exists
Run Code Online (Sandbox Code Playgroud)

我在用:

ext.versions = [
   ...
   nav_version        : '2.2.2',
]

ext.libs = [
   ...
   nav_fragment       : "androidx.navigation:navigation-fragment-ktx:$versions.nav_version",
   nav_ui             : "androidx.navigation:navigation-ui-ktx:$versions.nav_version",
]
Run Code Online (Sandbox Code Playgroud)

在应用程序gradle

 ...
    buildTypes {
        debug …
Run Code Online (Sandbox Code Playgroud)

android android-fragments kotlin android-navigation android-architecture-navigation

3
推荐指数
1
解决办法
991
查看次数

在片段中隐藏底部导航视图

我想在某些片段中隐藏 bottomNavigationView。

我试过下面的代码,但它有闪烁的效果。(bottomNavigationView 在 nextFragment 变得可见之前隐藏。

    val navController = this.findNavController(R.id.nav_host_home)
    navController.addOnDestinationChangedListener { _, destination, _ ->
    when (destination.id) {
        R.id.searchArticlesFragment -> bnvMain.visibility = View.GONE
        R.id.articleFragment -> bnvMain.visibility = View.GONE
            else -> bnvMain.visibility = View.VISIBLE
        }
    }
Run Code Online (Sandbox Code Playgroud)

我也试过另一个代码。但它会调整片段的大小。并在目标片段中给出 OutOfMemoryException。

    supportFragmentManager.registerFragmentLifecycleCallbacks(object :
        FragmentManager.FragmentLifecycleCallbacks() {
        override fun onFragmentViewCreated(
            fm: FragmentManager,
            f: Fragment,
            v: View,
            savedInstanceState: Bundle?
        ) {
            when (f) {
                is SearchArticlesFragment -> bnvMain.visibility = View.GONE
                is ArticleDetailsFragment -> bnvMain.visibility = View.GONE
                else -> bnvMain.visibility = View.VISIBLE
            }
        }
    }, true)
Run Code Online (Sandbox Code Playgroud)

请帮助我如何以正确和最好的方式隐藏底部导航视图?这是我可以隐藏底部导航视图的唯一方法吗?youtube …

android android-fragments kotlin android-navigation android-bottomnav

3
推荐指数
1
解决办法
2705
查看次数

是否可以在“Fragment”中膨胀包含“FragmentContainerView”的视图?

我正在尝试膨胀一个视图,该视图包含FragmentContainerView正在放入布局中的片段。

  • 根视图
    • 分段
      • 自定义视图
        • 片段容器视图

像这样:

val transaction = fragmentManager.beginTransaction()
transaction.replace(R.id.main_content, Frag(), "tag");
transaction.commitNowAllowingStateLoss()
Run Code Online (Sandbox Code Playgroud)

其中Frag创建一个视图,该视图会像这样扩展 xml:

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:parentTag="android.widget.FrameLayout">

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/nav_graph" />
</merge>
Run Code Online (Sandbox Code Playgroud)

但是当我执行代码时,我的应用程序崩溃了:

引起原因:java.lang.IllegalStateException:FragmentManager 已经在执行事务


如何在使用时避免此错误FragmentContainerView(观察:如果我使用<fragment>而不是<androidx.fragment.app.FragmentContainerView>,一切正常)

android android-fragments android-navigation android-navigation-graph

3
推荐指数
1
解决办法
1095
查看次数

单击抽屉后如何继续显示汉堡包图标而不是后退/向上图标?

我正在关注 Codelab https://developer.android.com/codelabs/kotlin-android-training-add-navigation/index.html#9,并使用以下代码来连接抽屉:

class MainActivity : AppCompatActivity() {

    private lateinit var drawerLayout : DrawerLayout

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        @Suppress("UNUSED_VARIABLE")
        val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
        drawerLayout = binding.drawerLayout

        val navController = findNavController(R.id.myNavHostFragment)
        // To support up action and also the title, the third parameter is optional and is used
        // for the hamburger menu for drawer.
        NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout)

        // show the navigation drawer
        NavigationUI.setupWithNavController(binding.navView, navController)
    }

    override fun onSupportNavigateUp(): Boolean {
        val navController = findNavController(R.id.myNavHostFragment)

        // this …
Run Code Online (Sandbox Code Playgroud)

android android-navigation android-architecture-navigation

3
推荐指数
1
解决办法
920
查看次数

升级到导航版本 2.4.0-alpha02 后“getActionId 不覆盖任何内容”

我从版本 2.3 升级到 2.4.0-alpha02 后遇到了这个问题。新版本应该包含修复程序,但它对我不起作用。作为参考,我的操作定义如下:

<action
        android:id="@+id/action_from_to_destination"
        app:destination="@id/destination" />
Run Code Online (Sandbox Code Playgroud)

android android-navigation android-architecture-navigation

3
推荐指数
1
解决办法
1352
查看次数

增加所选底部导航项的大小

我已经使用 Jetpack Compose 实现了一个底部导航栏(5 个图标,标签仅在选择项目时显示)。根据 1 个要求,我需要增加所选底部导航项的宽度(不是项目的图标,而是整个项目)。

因此,不是所有底部导航项都具有相同的宽度: 在此处输入图片说明

我需要所选项目的大小是其他未选择项目的两倍,并且需要减少未选择项目的宽度:

在此处输入图片说明

关于如何在 Jetpack Compose 中实现这一目标的任何提示?我已经尝试使用 BottomNavigationItem Composable 上的修饰符来增加/减小底部导航项的大小,但这根本没有改变大小。

android kotlin android-navigation android-jetpack-compose

3
推荐指数
1
解决办法
146
查看次数