我有一个 ListFragment 有一个 recyclerview 和 onClick 任何项目打开 DetailsFragment。详细信息片段在底部包含另一个显示“更多项目”的回收站视图。现在 onClick 任何这些项目应该打开该特定项目的 DetailsFragment。基本上片段需要刷新。
过去,我只会使用 fragmentManager 替换 fragment。我如何去刷新片段?如何创建指向同一个片段的动作?
android android-fragments android-architecture-components android-jetpack android-architecture-navigation
我正在学习ViewModel,LiveData并且在此过程中产生了疑问。
如果我需要启动一个,我应该怎么做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
我花了很多时间试图弄清楚为什么在下面的代码中(接近结尾),我在 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 android-mvvm android-livedata android-architecture-components
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
我正在使用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
从最近我的应用程序开始在预发布报告中包含奇怪的错误消息(上传到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
我需要将域对象映射到UI对象并使用实时分页列表进行显示.
我试图映射LiveData<PagedList<X>>到LiveData<PagedList<Y>>并映射PositionalDataSource<X>到PositionalDataSource<Y>,但由于包私有和私有限制,如果不将我的代码放在android.arch.paging包中并使用反射或使用修改版本的分页库,这些似乎都是不可能的.
有没有人知道如何在不诉诸这种不良方法的情况下做到这一点?
(请注意,如果分页库API使用接口而不是抽象基类,这将不会成为问题 - 这将允许包装任何分页列表/数据源并添加适当的映射.)
我一直在与谷歌的拱库一起工作,但是让测试变得困难的一件事就是合作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)
两个问题:
PagedList<Foo>?我的目标是以更加端到端的方式进行验证(例如确保在屏幕上显示正确的Foos列表).片段/活动/视图是PagedList<Foo>从ViewModel 观察的片段/活动/视图.
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
我正在使用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
android ×10
android-architecture-components ×10
viewmodel ×2
android-architecture-lifecycle ×1
android-architecture-navigation ×1
android-mvvm ×1
dagger ×1
dagger-2 ×1
firebase ×1
java ×1
kotlin ×1