首页 > 解决方案 > 如何使用导航底部菜单存储片段的状态

问题描述

我正在尝试将我的片段组件的值存储在一个具有较低导航菜单的活动中,由 navController 控制。我的问题是,当我使用底部导航将一个片段更改为另一个片段(onPause)或旋转屏幕时,组件布局中的所有数据都会丢失。有解决这个问题的方法吗?

标签: javaandroid

解决方案


将数据存储在 Viewmodel 中并从 UI 中观察它。如果框架在配置更改或其他事件期间销毁并重新创建活动和片段,则存储的数据不会丢失。

https://developer.android.com/topic/libraries/architecture/viewmodel?hl=en

创建扩展 ViewModel 的类并将变量作为 LiveData 存储在其中,如下例所示:

public class MyViewModel extends ViewModel {
    private MutableLiveData<List<User>> users;
    public LiveData<List<User>> getUsers() {
        if (users == null) {
            users = new MutableLiveData<List<User>>();
            loadUsers();
        }
        return users;
    }

    private void loadUsers() {
        // Do an asynchronous operation to fetch users.
    }
}

然后您可以像这样从活动和片段访问视图模型。

public class MyActivity extends AppCompatActivity {
    public void onCreate(Bundle savedInstanceState) {
        // Create a ViewModel the first time the system calls an activity's onCreate() method.
        // Re-created activities receive the same MyViewModel instance created by the first activity.

        MyViewModel model = new ViewModelProvider(this).get(MyViewModel.class);
        model.getUsers().observe(this, users -> {
            // update UI
        });
    }

有关更多详细信息,请查看上面链接中的文档。


推荐阅读