Soh*_*han 10 android fragment android-viewpager
我需要一些帮助来解决以下崩溃问题。我耳目一新,我就重新启动列表Activity通过调用fragment在viewpager刷新其列表。以下是崩溃的堆栈跟踪:
Caused by java.lang.IllegalStateException: Can't create ViewModelProvider for detached fragment
at android.arch.lifecycle.ViewModelProviders.checkActivity(ViewModelProviders.java:51)
at android.arch.lifecycle.ViewModelProviders.of(ViewModelProviders.java:105)
at com.ui.fragments.mainpagerfragments.ConversationListFragment.searchConversation(ConversationListFragment.java:383)
at com.ui.activities.HomeActivity.onRestart(HomeActivity.java:288)
at android.app.Instrumentation.callActivityOnRestart(Instrumentation.java:1256)
at android.app.Activity.performRestart(Activity.java:6365)
at android.app.Activity.performResume(Activity.java:6376)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3299)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3345)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1532)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5728)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
Run Code Online (Sandbox Code Playgroud)
从活动 onRestart 调用:
((MyListFragment) adapter.getFragmentAtPosition(0)).search("");
Run Code Online (Sandbox Code Playgroud)
片段中的方法:
public void search(String query) {
query = "%" + query + "%";
if (myListViewModel == null) {
myListViewModel = ViewModelProviders.of(this, viewModelFactory).get(MyListViewModel.class);
}
if (myListViewModel.mList != null && myListViewModel.mList.hasActiveObservers()) {
myListViewModel.mList.removeObservers(this);
}
myListViewModel.getFilteredList(query).observe(this, mainObserver);
}
Run Code Online (Sandbox Code Playgroud)
如果您使用的是 viewpager,请确保相应的片段实际附加到其活动(这是错误试图告诉您的内容)。可能会发生片段不可见的情况,因此它没有被附加(取决于视图寻呼机的配置方式)。
一个快速而肮脏的修复:
public void search(String query) {
if(!isAdded()) return; //<---- returns if the fragment is not attached
query = "%" + query + "%";
if (myListViewModel == null) {
myListViewModel = ViewModelProviders.of(this, viewModelFactory).get(MyListViewModel.class);
}
if (myListViewModel.mList != null && myListViewModel.mList.hasActiveObservers()) {
myListViewModel.mList.removeObservers(this);
}
myListViewModel.getFilteredList(query).observe(this, mainObserver);
}
Run Code Online (Sandbox Code Playgroud)
但是,您应该重新研究您的架构,因为这些检查通常意味着其他一些代码异味。当您使用新的 Android 架构模式时,应该不需要此检查,因为生命周期模式会为您处理所有这些:https : //developer.android.com/topic/libraries/architecture/lifecycle
所以,基本上,你不应该直接调用一个片段的任何函数,而是调用相应的业务逻辑,通知片段更新它的视图。
由于错误是片段尚未附加,因此需要在我们确定片段实际附加时进行。这是一个很好的方法;通过将代码放在覆盖方法onAttach 中
@Override
public void onAttach(Context context) {
super.onAttach(context);
myListViewModel = ViewModelProviders.of(this, viewModelFactory).get(MyListViewModel.class);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11124 次 |
| 最近记录: |