小编Kvd*_*gen的帖子

将viewModel观察者放在dialogFragment中的位置?

对于片段,建议将liveData观察者放在onActivityCreated方法中.这适用于片段,但当我将其应用于dialogFragment时,我收到以下错误:

java.lang.IllegalStateException:当getView()为null时,即在onCreateView()之前或onDestroyView()之后,无法访问Fragment View的LifecycleOwner.

从这个问题我在创建时读取了dialogFragment的生命周期:

onAttach
onCreate
onCreateDialog
onCreateView
onActivityCreated
onStart
onResume
Run Code Online (Sandbox Code Playgroud)

因此,将观察者放在onActivityCreated中应该没有问题,因为它在onCreateView或onCreateDialog之后.我使用后者,因为我使用自己的布局的Alertdialog.

这是我的观察者的代码:

mScheduleViewModel.getTeachers().observe(getViewLifecycleOwner(), new Observer<List<String>>() {
        @Override
        public void onChanged(@Nullable List<String> strings) {
            mStringList = strings;
            aclInputvalue.setThreshold(2);
            aclAdapter.setList(strings);
            aclAdapter.notifyDataSetChanged();
            ....
}
Run Code Online (Sandbox Code Playgroud)

此代码模式在片段中正常工作,但在dialogFragment中不起作用.我必须将lifecycleOwner设置为'this'.

那么为什么我会收到错误?

android android-livedata

15
推荐指数
1
解决办法
4182
查看次数

使用Material Button会产生ClassNotFound运行时错误

我正在使用<com.google.android.material.button.MaterialButtonXML文件和private MaterialButton dateButton;Java片段文件中的Material Buttons替换我的应用程序中的按钮.我研究了代码实验室" MDC-101 Android:Material Components(MDC)Basics(Java) "以了解如何使用Material Button.在gradle.build(Module:app)文件中,我添加了代码实验室中的依赖项.代码实验室编译并运行良好.我的应用程序编译正常,但在膨胀片段布局时出错:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: nl.kl_solutions.schedulecompareforzermelo, PID: 16708
              android.view.InflateException: Binary XML file line #26: Binary XML file line #26: Error inflating class com.google.android.material.button.MaterialButton
              Caused by: android.view.InflateException: Binary XML file line #26: Error inflating class com.google.android.material.button.MaterialButton
              Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.material.button.MaterialButton" on path: DexPathList[[zip file "/data/app/nl.kl_solutions.schedulecompareforzermelo-o6fuvqQPirym08EhaTRI6Q==/base.apk", zip file "/data/app/nl.kl_solutions.schedulecompareforzermelo-o6fuvqQPirym08EhaTRI6Q==/split_lib_dependencies_apk.apk", zip file "/data/app/nl.kl_solutions.schedulecompareforzermelo-o6fuvqQPirym08EhaTRI6Q==/split_lib_resources_apk.apk", zip file "/data/app/nl.kl_solutions.schedulecompareforzermelo-o6fuvqQPirym08EhaTRI6Q==/split_lib_slice_0_apk.apk", zip file "/data/app/nl.kl_solutions.schedulecompareforzermelo-o6fuvqQPirym08EhaTRI6Q==/split_lib_slice_1_apk.apk", zip file "/data/app/nl.kl_solutions.schedulecompareforzermelo-o6fuvqQPirym08EhaTRI6Q==/split_lib_slice_2_apk.apk", zip file "/data/app/nl.kl_solutions.schedulecompareforzermelo-o6fuvqQPirym08EhaTRI6Q==/split_lib_slice_3_apk.apk", zip file …
Run Code Online (Sandbox Code Playgroud)

android material-design

15
推荐指数
4
解决办法
1万
查看次数

LiveData 的更新值丢失

LiveData 向上游传播数据是否有最短时间?

我有一个从存储库更新的 MutuableLiveData。更新代码从 Internet 加载一些数据并设置 MutuableLiveData 的值。下载发生在一个或多个 workerThreads 上,并且正在使用下载的数据对存储库进行回调。这是相关代码。我使用同步来防止线程同时尝试更改变量。

在存储库中:

@Override
public void returnResult(Schedule scheduleToReturn) {
     synchronized(this){
     mSecondaryWeekSchedule.postValue(scheduleToReturn)};
}
Run Code Online (Sandbox Code Playgroud)

在片段中:

mScheduleViewModel.getOverlayWeekSchedule().observe(getViewLifecycleOwner(), new Observer<Schedule>() {
        @Override
        public void onChanged(@Nullable Schedule schedule) {
            Log.d(DEBUGTAG, "Overlay weekschedule changed");
            Log.d(DEBUGTAG, ""+schedule.toString());
            addOverlay(schedule);
        }
    });
Run Code Online (Sandbox Code Playgroud)

getOverlayWeekSchedule 只是链接到存储库中的 liveData 变量。在存储库中设置适当的 Log.d() 我发现:

08-20 21:11:25.982 3001-3049/nl.kl_solutions.schedulecompareforzermelo D/ScheduleRepository:计划返回:Owner:hym WeekStart:03 Sep Events:19 08-20 21:11:20.013l.3k.3 schedulecompareforzermelo D/ScheduleRepository:计划返回:Owner:6409 WeekStart:03 Sep Events:27 08-20 21:11:26.348 3001-3001/nl.kl_solutions.schedulecompareforzermelo D/WeekScheduleFragment:03Sep16:26.348 3001-3001/nl.kl_solutions.schedulecompareforzermelo D/WeekScheduleFragment: Owner:6409 WeekStart:03 Sep Events:27

前两行来自,repository 显示了通过回调返回到不同线程上的存储库的时间表。最后两行是片段中观察者的一次触发,仅显示记录了对最后一个计划的更改。第一个变化在某处丢失了。

android android-livedata

3
推荐指数
2
解决办法
1424
查看次数