Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 由java.lang.IllegalStateException引起:Can';t为分离的片段创建ViewModelProvider_Android_Android Viewpager_Fragment - Fatal编程技术网

Android 由java.lang.IllegalStateException引起:Can';t为分离的片段创建ViewModelProvider

Android 由java.lang.IllegalStateException引起:Can';t为分离的片段创建ViewModelProvider,android,android-viewpager,fragment,Android,Android Viewpager,Fragment,我需要一些帮助来解决下面的崩溃。通过调用viewpager中的fragment刷新列表,我正在Activity中重新启动时刷新列表。以下是崩溃的详细情况: Caused by java.lang.IllegalStateException: Can't create ViewModelProvider for detached fragment at android.arch.lifecycle.ViewModelProviders.checkActivity(ViewModelP

我需要一些帮助来解决下面的崩溃。通过调用
viewpager
中的
fragment
刷新列表,我正在
Activity
中重新启动时刷新列表。以下是崩溃的详细情况:

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)
从“活动重新启动”调用:

((MyListFragment) adapter.getFragmentAtPosition(0)).search("");
片段中的方法:

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);
    }

如果您使用的是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);
}
公共作废搜索(字符串查询){

如果(!isAdded())返回;//,因为错误是片段尚未附加,所以需要在确定片段实际已附加时执行此操作。这是一种很好的方法;将代码放入重写方法onAttach中


发布您的代码。更新了相关代码的补丁,因为我无法在此发布完整的代码。未找到attach()方法…如果在同一方法中分离片段,我可以附加片段吗?例如if(isDetached()){activity.getSupportFragmentManager().beginTransaction().attach(this.commitAllowingStateLoss())}对不起,是我的错:应该是
isAdded()。您不应该尝试将片段附加在适当位置,并且假定其余代码将工作,因为附加进程是异步的,除非您等待附件,否则函数可能仍然失败。再次,考虑代码的重构。这里说明:当片段为CR时,您应该创建一次模型。在相应的函数中创建并更新模型。@DenisLoh您能演示一下只将业务逻辑从一个片段更新到另一个片段而不调用其方法的方法吗?请解释您的答案-到底是什么问题,以及您是如何解决的?@Markus认为这很明显是为了解决问题,以及我是如何我想这是答案。但我可以在答案中解释更多。请删除你的否决票。
@Override
public void onAttach(Context context) {
    super.onAttach(context);
    myListViewModel = ViewModelProviders.of(this, viewModelFactory).get(MyListViewModel.class);
}