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 获取选定项的主要内容,如果未能解决你的问题,请参考以下文章
使用 Volley 库未从 Android 收到 PHP POST