我想从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 B,FragmentA (RootFragment) 就会泄漏。 …
android memory-leaks android-fragments android-navigation leakcanary
学习这个并阅读文档我无法理解我应该放什么viewId
Navigation.findNavController(Activity, @IdRes int viewId)
Run Code Online (Sandbox Code Playgroud)
我为导航架构组件做了Codelab,但那是 Kotlin 代码。我需要Java。
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
我知道可以在源片段中使用 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
我有 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
我想在某些片段中隐藏 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
我正在尝试膨胀一个视图,该视图包含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
我正在关注 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) 我从版本 2.3 升级到 2.4.0-alpha02 后遇到了这个问题。新版本应该包含修复程序,但它对我不起作用。作为参考,我的操作定义如下:
<action
android:id="@+id/action_from_to_destination"
app:destination="@id/destination" />
Run Code Online (Sandbox Code Playgroud) 我已经使用 Jetpack Compose 实现了一个底部导航栏(5 个图标,标签仅在选择项目时显示)。根据 1 个要求,我需要增加所选底部导航项的宽度(不是项目的图标,而是整个项目)。
我需要所选项目的大小是其他未选择项目的两倍,并且需要减少未选择项目的宽度:
关于如何在 Jetpack Compose 中实现这一目标的任何提示?我已经尝试使用 BottomNavigationItem Composable 上的修饰符来增加/减小底部导航项的大小,但这根本没有改变大小。
android ×10
android-architecture-navigation ×3
kotlin ×3
android-architecture-components ×1
leakcanary ×1
memory-leaks ×1
navigation ×1