【发布时间】:2020-09-07 15:37:23
【问题描述】:
我在第二次加载 Fragment 时遇到此错误。这很奇怪,因为在第一次加载片段时没有任何问题。这是错误:
java.lang.IllegalStateException: Fragment ShopFragment{8f5d575} (89cc4724-c435-49f4-ad05-4de4f1d18fc9)} not attached to an activity.
at androidx.fragment.app.Fragment.requireActivity(Fragment.java:833)
at com.example.fragmentapp.ui.fragments.ShopFragment$4.onChanged(ShopFragment.java:138)
仅当我第二次打开片段并且应用程序崩溃时才会发生这种情况。我从 MVVM 和 Room 开始,所以我不是这方面的专家,所以我有点迷失。 这是我的片段中的代码
public class ShopFragment extends Fragment {
private ShopViewModel shopViewModel;
private Spinner spDeptoShop;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_shop, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
shopViewModel = new ViewModelProvider(requireActivity()).get(ShopViewModel.class);
spDeptoShop = (Spinner) view.findViewById(R.id.sp_deparmento_shop);
init();
subscribeObservers();
}
private void init() {
shopViewModel.getDeptosLocal();
}
private void subscribeObservers() {
shopViewModel.getDeptos().observe(requireActivity(), new Observer<Resource<List<Departamento>>>() {
@Override
public void onChanged(Resource<List<Departamento>> listResource) {
if(listResource != null){
Log.d(TAG, "onChanged: status: " + listResource.status);
if(listResource.data != null){
switch (listResource.status){
case LOADING:{
break;
}
case ERROR:{
Log.e(TAG, "onChanged: cannot refresh the cache." );
Log.e(TAG, "onChanged: ERROR message: " + listResource.message );
Log.e(TAG, "onChanged: status: ERROR, #DEPARTAMENTO: " + listResource.data.size());
break;
}
case SUCCESS:{
Log.d(TAG, "onChanged: cache has been refreshed.");
Log.d(TAG, "onChanged: status: SUCCESS, #DEPARTAMENTO: " + listResource.data.size());
if(listResource.data != null && listResource.data.size()>0)
{
spDeptoShop.setAdapter( new ArrayAdapter<Departamento>(requireActivity(), R.layout.spinner_list_item, listResource.data));
}
else{
}
break;
}
}
}
}
}
});
}
@Override
public void onPause() {
super.onPause();
shopViewModel.cancelRequest();
}
}
错误在一行:
spDeptoShop.setAdapter( new ArrayAdapter<Departamento>(requireActivity(), R.layout.spinner_list_item, listResource.data));
【问题讨论】:
标签: android android-fragments android-activity android-room