我正在尝试使用新的导航组件.我使用带有navController的BottomNavigationView:NavigationUI.setupWithNavController(bottomNavigation,navController)
但是当我切换片段时,即使它们以前被使用过,它们也会每次都被破坏/创建.
有没有办法让我们的主要片段链接到我们的BottomNavigationView?
我正在探索上个月在Google I/O 2018中引入的"导航架构组件"概念.
假设我有一个带有底部导航视图和'片段'的活动来托管所有片段: -
<android.support.constraint.ConstraintLayout
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".view.MainActivity">
<fragment
android:id="@+id/root_form"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="androidx.navigation.fragment.NavHostFragment"
app:navGraph="@navigation/nav_graph"
app:defaultNavHost="true"
/>
<android.support.design.widget.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:menu="@menu/navigation" />
</android.support.constraint.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)
我的底部导航视图中有2个动作/标签,分别显示FragmentA和FragmentB.FragmentB有一个嵌套的(子)片段FragmentC,它可以从FragmentB打开.
在我的Activity类中,我使用'setupWithNavController()'函数将底部导航视图与导航控制器链接起来.(包含在'androidx.navigation.ui'包中的Kotlin扩展函数): -
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
bottom_navigation.setupWithNavController(findNavController(R.id.root_form))
}
Run Code Online (Sandbox Code Playgroud)
一切都按预期工作正常.
但是当用户在FragmentC中并且返回agin到相同的选项卡时,用户导航到FragmentA然后他将只获得FragmentB而不是fragmentC.当用户返回相同的选项卡时,它是底部导航中的常见模式,它应显示他正在查看的最后一个子/嵌套片段.
我知道如果我们有自己的片段事务但是如何在"导航架构组件"域中解决此问题,我们可以处理这个问题?
navigation android bottomnavigationview android-architecture-components android-jetpack
我有一个包含BottomNavigationView 的Activity,这个bottomnav 帮助Activity 显示三个片段。这些片段加载良好,我使用 AsyncTask 来执行每个繁重的操作,而在 UI 线程中,我会显示一个 ProgressBar 直到所有内容加载完毕。
我的片段有一个奇怪的行为:我第一次加载片段需要一些时间来实际显示它,而不是用进度条立即显示它。
这件事只发生在第一次,而且只发生在这个片段中。
片段代码仅包含以下内容:
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
new LoadData(getView(), getContext()).execute();
}
private class LoadData extends AsyncTask<Void, Void, Void> {
private View v;
private Context context;
public LoadData(View v, Context context) {
items = new ArrayList<>();
this.v = v;
this.context = context;
}
@Override
protected Void doInBackground(Void... voids) {
setItems(context); //Heavy operation
adapter = new DashAdapter(items, context);
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
//shows …Run Code Online (Sandbox Code Playgroud) 我已经开始使用新的导航组件,而且我真的在挖掘它!但是,我确实有一个问题-当我处于图表的起始目标位置时,应该如何处理后退按钮?
这是我现在使用的代码:
findNavController(this, R.id.my_nav_host_fragment)
.navigateUp()
Run Code Online (Sandbox Code Playgroud)
当我在图表上的任何地方时,它都工作得很好,它使我返回,但是当我在它的开始时,由于后备箱为空,因此应用程序崩溃。
这一切对我来说都很有意义,我只是不确定如何处理。
虽然我可以检查当前片段的ID是否与我知道是图的根的ID相同,但我正在寻找一种更优雅的解决方案,例如是否存在bool标志,以表明当前图中的位置是否为起始位置与否。
有想法吗?
android-navigation android-architecture-components android-architecture-navigation
android ×3
android-architecture-components ×2
navigation ×2
android-architecture-navigation ×1
java ×1