标签: android-architecture-components

导航架构组件 - 如何刷新片段?

我有一个 ListFragment 有一个 recyclerview 和 onClick 任何项目打开 DetailsFragment。详细信息片段在底部包含另一个显示“更多项目”的回收站视图。现在 onClick 任何这些项目应该打开该特定项目的 DetailsFragment。基本上片段需要刷新。

过去,我只会使用 fragmentManager 替换 fragment。我如何去刷新片段?如何创建指向同一个片段的动作?

android android-fragments android-architecture-components android-jetpack android-architecture-navigation

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

Android ViewModel 和 startActivity

我正在学习ViewModelLiveData并且在此过程中产生了疑问。

如果我需要启动一个,我应该怎么做Activity

是否可以将上下文作为参数传递给ViewModel(上下文不会存储在 ViewModel 中)?

ActivityAViewModel : ViewModel() {
    // ...

    fun openActivityB(context: Context) {
        context.startActivity(...)
    }

    // ...
}

ActivityA {
    // ...

    fun onSomethingHappened() {
        viewModel.openActivityB(this)
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

如果不是,在这种情况下最正确的做法是什么?

android viewmodel android-viewmodel android-architecture-components

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

无法解析片段中的 ViewModelProvider 构造?

我花了很多时间试图弄清楚为什么在下面的代码中(接近结尾),我在 ViewModelProvider(this) 上遇到错误。我也试过 getActivity() 而不是 'this',同样的问题。我得到的错误是“无法解析构造函数......”


import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;



public class ItemSetupFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_setup, container, false);

        return view;
    }

    @Override
    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        ItemSetupFragmentModel model = new ViewModelProvider(this).get(ItemSetupFragmentModel.class);
        model.getKids().observe(this, users -> {
            // update UI
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

显示 Android Studio 中编译错误的图像

android android-mvvm android-livedata android-architecture-components

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

ViewModel是否能够在活动保存和恢复后生存?

ViewModel如果以下列方式使用,新类的实例可以在配置更改后继续存在:

mViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
Run Code Online (Sandbox Code Playgroud)

但是,除了配置更改之外,还有一个保存还原方案,当整个应用程序的进程被终止时.

ViewModel在保存还原方案中,是否会保留字段内的值?


编辑:根据这个问题的答案,我写了这篇文章:Android ViewModel Architecture Component is Dangerous

android viewmodel view-model-pattern android-viewmodel android-architecture-components

14
推荐指数
2
解决办法
5886
查看次数

无法创建自定义ViewModel的实例

我正在使用dagger2库.每当我试图运行我的项目时,都表示无法创建视图模型类的实例.

我正在尝试创建实例的主要活动

   ((MovieApplication) getApplication()).getAppComponent().inject(this);
    mViewModel = ViewModelProviders.of(this).get(MoviesDataViewModel.class);
Run Code Online (Sandbox Code Playgroud)

我的工厂班

public class ViewModelFactory implements ViewModelProvider.Factory {
private MoviesDataViewModel mViewModel;

@Inject
public ViewModelFactory(MoviesDataViewModel viewModel) {
    this.mViewModel = viewModel;
}

@Override
public <T extends ViewModel> T create(Class<T> modelClass) {
    if (modelClass.isAssignableFrom(MoviesDataViewModel.class)) {
        return (T) mViewModel;
    }
    throw new IllegalArgumentException("Unknown class name");
}
Run Code Online (Sandbox Code Playgroud)

我的日志

  Caused by: java.lang.RuntimeException: Cannot create an instance of class com.moviedata.viewmodel.MoviesDataViewModel
                                                               at android.arch.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:145)
                                                               at android.arch.lifecycle.ViewModelProviders$DefaultFactory.create(ViewModelProviders.java:143)
                                                               at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:128)
                                                               at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:96)
                                                               at com.moviedata.ui.MainActivity.onCreate(MainActivity.java:28)
                                                               at android.app.Activity.performCreate(Activity.java:6321)
                                                               at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
                                                               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2426)
                                                               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2535) 
                                                               at android.app.ActivityThread.access$1100(ActivityThread.java:154) 
                                                               at …
Run Code Online (Sandbox Code Playgroud)

android dependency-injection dagger dagger-2 android-architecture-components

14
推荐指数
1
解决办法
5908
查看次数

由于缺少方法而导致发布前报告失败(在com.google.android.apps.mtaas.crawler-1/base.apk中)

从最近我的应用程序开始在预发布报告中包含奇怪的错误消息(上传到Play商店后自动生成).

这些报告包含以下异常:

Exception java.lang.NoSuchMethodError: No interface method a(Landroid/arch/lifecycle/e;Landroid/arch/lifecycle/b$a;)V in class Landroid/arch/lifecycle/GenericLifecycleObserver; or its super classes (declaration of 'android.arch.lifecycle.GenericLifecycleObserver' appears in /data/app/com.google.android.apps.mtaas.crawler-1/base.apk)
android.arch.lifecycle.f$a.a (f.java:326)
android.arch.lifecycle.f.a (f.java:159)
com.firebase.ui.database.FirebaseRecyclerAdapter.<init> (FirebaseRecyclerAdapter.java:40)
Run Code Online (Sandbox Code Playgroud)

和:

Exception java.lang.NoSuchMethodError: No static method a(Landroid/app/Activity;)V in class Landroid/arch/lifecycle/ReportFragment; or its super classes (declaration of 'android.arch.lifecycle.ReportFragment' appears in /data/app/com.google.android.apps.mtaas.crawler-1/base.apk)
android.arch.lifecycle.LifecycleDispatcher$DispatcherActivityCallback.onActivityCreated (LifecycleDispatcher.java:77)
android.app.Application.dispatchActivityCreated (Application.java:219)
android.app.Activity.onCreate (Activity.java:1040)
android.support.v4.app.SupportActivity.onCreate (SupportActivity.java:66)
android.support.v4.app.FragmentActivity.onCreate (FragmentActivity.java:285)
android.support.v7.app.AppCompatActivity.onCreate (AppCompatActivity.java:84)
Run Code Online (Sandbox Code Playgroud)

和:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.arch.core.internal.SafeIterableMap.size()' on a null object reference
    at android.arch.lifecycle.LifecycleRegistry.getObserverCount(LifecycleRegistry.java:204)
    at android.arch.lifecycle.ProcessLifecycleOwner.b(ProcessLifecycleOwner.java:154)
    at …
Run Code Online (Sandbox Code Playgroud)

android firebase firebase-test-lab android-architecture-lifecycle android-architecture-components

14
推荐指数
1
解决办法
1530
查看次数

将LiveData <PagedList <X >>映射到LiveData <PagedList <Y >>

我需要将域对象映射到UI对象并使用实时分页列表进行显示.

我试图映射LiveData<PagedList<X>>LiveData<PagedList<Y>>并映射PositionalDataSource<X>PositionalDataSource<Y>,但由于包私有和私有限制,如果不将我的代码放在android.arch.paging包中并使用反射或使用修改版本的分页库,这些似乎都是不可能的.

有没有人知道如何在不诉诸这种不良方法的情况下做到这一点?

(请注意,如果分页库API使用接口而不是抽象基类,这将不会成为问题 - 这将允许包装任何分页列表/数据源并添加适当的映射.)

android android-architecture-components

14
推荐指数
2
解决办法
1476
查看次数

如何为测试创建对象的PagedList?

我一直在与谷歌的拱库一起工作,但是让测试变得困难的一件事就是合作PagedList.

对于此示例,我使用存储库模式并从API或网络返回详细信息.

所以在ViewModel中我调用了这个接口方法:

override fun getFoos(): Observable<PagedList<Foo>>
Run Code Online (Sandbox Code Playgroud)

然后,存储库将RxPagedListBuilder用于创建Observable类型为PagedList的类型:

 override fun getFoos(): Observable<PagedList<Foo>> =
            RxPagedListBuilder(database.fooDao().selectAll(), PAGED_LIST_CONFIG).buildObservable()
Run Code Online (Sandbox Code Playgroud)

我希望能够通过这些返回a的方法设置返回测试PagedList<Foo>.类似的东西

when(repository.getFoos()).thenReturn(Observable.just(TEST_PAGED_LIST_OF_FOOS)
Run Code Online (Sandbox Code Playgroud)

两个问题:

  1. 这可能吗?
  2. 我该如何创建PagedList<Foo>

我的目标是以更加端到端的方式进行验证(例如确保在屏幕上显示正确的Foos列表).片段/活动/视图是PagedList<Foo>从ViewModel 观察的片段/活动/视图.

android android-architecture-components android-paging

14
推荐指数
3
解决办法
2591
查看次数

如何在WorkManager for Android中创建具有参数的Worker?

Android架构有一个新的组件WorkManager.

例子中,

class CompressWorker(context : Context, params : WorkerParameters)
    : Worker(context, params) {

    override fun doWork(): Result {

        // Do the work here--in this case, compress the stored images.
        // In this example no parameters are passed; the task is
        // assumed to be "compress the whole library."
        myCompress()

        // Indicate success or failure with your return value:
        return Result.SUCCESS

        // (Returning RETRY tells WorkManager to try this task again
        // later; FAILURE says not to …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-architecture-components android-workmanager

14
推荐指数
2
解决办法
6019
查看次数

分页库最初返回空列表

我正在使用Paging库来分页我正从服务器检索的项目列表.最初,当我的片段被加载时,它返回一个空列表.但是在更改片段并返回到该片段后,我可以看到列表已加载.调试后,我看到实际上正在获取数据,但是一个空列表被传递给我的片段.

ItemDataSource:

@Override
public void loadInitial(@NonNull LoadInitialParams<Integer> params, @NonNull LoadInitialCallback<Integer, Item> callback) {
    apiService.getItems(OFFSET)
    .enqueue(new Callback<ItemWrapper>() {
        @Override
        public void onResponse(@NonNull Call<ItemWrapper> call,@NonNull Response<ItemWrapper> response) {
            callback.onResult(response.body().getItems(), null, OFFSET + 25);
        }

        @Override
        public void onFailure(@NonNull Call<ItemWrapper> call,@NonNull Throwable t) {
            t.printStackTrace();
        }
    });
}

@Override
public void loadBefore(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<Integer, Item> callback) {

}

@Override
public void loadAfter(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<Integer, Item> callback) {
    apiService.getItems(params.key)
            .enqueue(new Callback<ItemWrapper>() {
                @Override
                public void onResponse(@NonNull Call<ItemWrapper> call,@NonNull Response<ItemWrapper> response) …
Run Code Online (Sandbox Code Playgroud)

java android android-architecture-components android-jetpack android-paging

14
推荐指数
2
解决办法
973
查看次数