通过使用导航架构停止重新加载先前的片段

时间:2019-05-16 06:27:58

标签: android android-jetpack

如何通过按后退按钮

停止从当前片段重新加载先前的片段

例如 好像我们正从背面的列表片段移动到详细信息片段一样,无需使用Android Jet Pack和导航架构再次重新加载列表片段

<fragment
        android:id="@+id/my_nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:navGraph="@navigation/navigation_graph" />

2 个答案:

答案 0 :(得分:2)

导航组件目前仅支持片段替换。因此,您将无法像手动片段事务那样添加()片段。

但是,如果您担心要重新扩大布局并重新获取片段的数据,则可以通过以下两种方法轻松解决。

  1. 创建视图后,将其存储在变量中,并在调用onCreateView()时使用它。
private var view: View? = null

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

    if (view == null) {
        view = inflater.inflate(R.layout.fragment_list, container, false)
                //...
    }

    return view

 }

来源:https://twitter.com/ianhlake/status/1103522856535638016

  1. 将ViewModel与Fragment一起使用,并将所需的数据作为成员变量保存。 这样,替换关联的片段时不会清除数据。仅在片段的onDestroy()上清除ViewModel,这仅在销毁父活动时才会发生。 https://developer.android.com/images/topic/libraries/architecture/viewmodel-lifecycle.png

答案 1 :(得分:0)

您需要这些方法

  

getFragmentManager()。popBackStackImmediate();

     

getFragmentManager()。popBackStack()

看看下面的链接,还有更多可供选择。祝你有美好的一天。

https://developer.android.com/reference/android/support/v4/app/FragmentManager.html#popbackstackimmediate_1

您要求我提供更多帮助。我正在更新答案

做这样的事情

@Override
public void onBackPressed(){
    FragmentManager fm = getFragmentManager();
    if (fm.getBackStackEntryCount() > 0) {
    Log.i("MainActivity", "popping backstack");
    fm.popBackStack();
    } else {
    Log.i("MainActivity", "nothing on backstack, calling super");
    super.onBackPressed();  
    }
}