Android ViewModel 未从 BackStackEntry 获取选定项

Posted

技术标签:

【中文标题】Android ViewModel 未从 BackStackEntry 获取选定项【英文标题】:Android ViewModel not getting Selected Item from BackStackEntry 【发布时间】:2022-01-05 11:56:23 【问题描述】:

我有一个可以从底部导航栏访问的地图片段。我还希望能够通过单击我的回收站视图来访问它(如果从回收站视图中单击它,则显示来自回收站视图的位置)。为此,我尝试检查 backstack 以查看 listfragment 是否存在。我无法让它工作,有人可以看到我的代码的问题吗?

视图模型:

    private final MutableLiveData<Fish> selected = new MutableLiveData<Fish>();

public void select(Fish item) 
    selected.setValue(item);


public LiveData<Fish> getSelected() 
    return selected;



public MapViewModel(Application application)
    super(application);

ListFragment(选择在onclick方法中):

mMapViewModel = ViewModelProviders.of(this).get(MapViewModel.class);
Log.d("view-click", String.valueOf(fish.getLocation()));

                mMapViewModel.select(fish);
                Navigation.findNavController(view).navigate(R.id.action_fishListFragment_to_mapFragment2);

地图片段:

NavController navController = NavHostFragment.findNavController(this);
    NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.fishListFragment);

    mMapViewModel = new ViewModelProvider(backStackEntry).get(MapViewModel.class);
    mMapViewModel.getSelected().observe(backStackEntry, list -> 
        Log.d("MAPFRAGMENT",list.getLocation() + "");
    );

我没有收到任何错误,但我也没有在 logcat 窗口中获得 MAPFRAGMENT 日志。我已经验证我的 logcat 正在工作,并且 onclick 方法实际上是在 viewmodel 中设置值。

【问题讨论】:

SharedViewModel 我正在使用共享视图模型。我想检查后台堆栈以查看用户来自哪里,如果他们来自按钮,我想显示列表中的位置,如果不是,我想显示他们当前的位置。 【参考方案1】:

ViewModelProviders.of(this) 将 ViewModel 与 this 相关联 - 您的 Fragment 本身,而不是 NavBackStackEntry(它是 Fragment 层之上的一个完全独立的层)。

相反,您需要在 FishListFragment 中使用 navController.getCurrentBackStackEntry()new ViewModelProvider() 将 ViewModel 与您稍后在 MapFragment 中访问的 NavBackStackEntry 相关联:

NavController navController = Navigation.findNavController(view);
NavBackStackEntry currentBackStackEntry = navController.getCurrentBackStackEntry();
mMapViewModel = new ViewModelProvider(currentBackStackEntry).get(MapViewModel.class);
Log.d("view-click", String.valueOf(fish.getLocation()));

mMapViewModel.select(fish);
navController.navigate(R.id.action_fishListFragment_to_mapFragment2);

【讨论】:

谢谢,几乎成功了。如果我首先从底部导航加载地图片段,然后返回列表片段,然后单击“转到位置按钮”,它将记录正确的位置。但是,如果我首先加载 listfragment 并单击“转到位置”按钮,它不会记录 MAPFRAGMENT: Location 日志,直到我单击列表片段的底部导航按钮。知道为什么会这样吗?

以上是关于Android ViewModel 未从 BackStackEntry 获取选定项的主要内容,如果未能解决你的问题,请参考以下文章

未从 Android 地理围栏事件收到 Intent

使用 Volley 库未从 Android 收到 PHP POST

ViewPager 未从代码、android、eclipse 更新

未从 d-pad 选择 android 电视菜单

Android 应用程序未从快捷方式启动

未从 LocationManager 中清除的 Android 模拟位置提供程序