我正在使用Dagger 2 DataBindng和新的Android Lifecycle组件,这些组件具有ViewModels。
在我的内部,ViewModel如何访问我的strings.xml?我在想,在第一,注入Context到viewModel,然而,这只会泄漏内存。
还有其他方法吗?
android android-context dagger-2 android-viewmodel android-architecture-components
我试图弄清楚如何将视图模型绑定到底部表,以便我可以使用视图模型上的可观察字段使底部表同时展开、折叠和隐藏。
谢谢!
我正在研究Android ViewModel架构组件,但在尝试初始化AppCompatActivity中的ViewModel时遇到上述错误.
import android.arch.lifecycle.ViewModelProviders;
ViewModelProviders.of(this).get(CounterViewModel.class);
Run Code Online (Sandbox Code Playgroud)
有一些与此相关的问题和文章,他们指出在app gradle文件中添加lifecycle:extensions和lifecycle:viewmodel依赖,但我仍然得到错误.
implementation "android.arch.lifecycle:extensions:1.1.1"
implementation "android.arch.lifecycle:viewmodel:1.1.1"
annotationProcessor "android.arch.lifecycle:compiler:1.1.1"
Run Code Online (Sandbox Code Playgroud)
android.arch.lifecycle包不包含类ViewModelProviders,只有ViewModelProvider类.
还需要添加什么才能访问ViewModelProviders课程?
编辑:
app/build.gradle中的依赖项:
dependencies {
implementation project(':lifecycle')
implementation project(':base')
implementation "android.arch.lifecycle:extensions:1.1.1"
implementation "android.arch.lifecycle:viewmodel:1.1.1"
annotationProcessor "android.arch.lifecycle:compiler:1.1.1"
}
Run Code Online (Sandbox Code Playgroud)
Activivity应用程序中有一个名为 MainActivity 的应用程序。MainActivity 与ViewModelOnCreate 方法中的a 相关联
...
val someViewModel = ViewModelProviders.of(this).get(SomeViewModel::class.java)
...
Run Code Online (Sandbox Code Playgroud)我做了一些背景工作Workers。
val someWork = OneTimeWorkRequestBuilder<LoginWorker>().build()
WorkManager.getInstance().beginUniqueWork("SOMEWORK", ExistingWorkPolicy.REPLACE, captivePortalWork).enqueue()
问题来了……worker例如,循环 10 次,每次只睡一秒钟……所以我们有 10 秒的后台工作。我想更新ViewModel以显示后台工作的进度并每次更新UI。
A) 我可以从 MainActivity 访问 View 模型并观察worker但我只能ViewModel在进度成功或失败时更新...这意味着我可以在工作完成 0 或 100% 时显示进度。
B) 如果我可以从 Worker 类访问 ViewModel,我可以随时更新 ViewModel。但我不知道如何......这个方法在 Worker 类中不起作用。
val someWork = ViewModelProviders.of(this).get(SomeViewModel::class.java)
我怎样才能ViewModel从Worker课堂上获得一个?
android android-viewmodel android-architecture-components android-workmanager
我有一个带有视图模型 (VM1) 的片段 (FRAG1)。我正在 FragmentPagerAdapter 中创建此片段的两个新实例以加载到 ViewPager 中。
Viewpager 存在于父 Fragment 中。
两个片段实例中的 ViewModels 似乎都不是唯一的。两个片段实例似乎都具有在最后初始化的第二个片段中创建的 ViewModel 实例的属性。
private inner class ItDeclarationFragAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm)
{
override fun getItem(position: Int): Fragment
{
return when (position)
{
0 -> ITDeclarationSummaryFragment.newInstance(false)
1 -> ITDeclarationSummaryFragment.newInstance(true)
else -> ITDeclarationSummaryFragment.newInstance(false)
}
}
override fun getCount(): Int
{
return 2
}
override fun getPageTitle(position: Int): CharSequence?
{
return when (position)
{
0 -> resources.getString(R.string.zpl_itDeclaration_tile)
1 -> resources.getString(R.string.zpl_itDeclaration_poi_title)
else -> resources.getString(R.string.zpl_reimbursements_summary)
}
}
}
Run Code Online (Sandbox Code Playgroud)
Fragment 在 OnCreate() 中创建新创建的 …
android android-fragments android-viewpager android-viewmodel android-architecture-components
我是 Android 新手,我已经完成了一些 Android 应用程序开发课程,现在我正在尝试应用我学到的知识。我为它选择了一个新闻应用程序。它将从 5-10 个来源中提取新闻并将它们显示在 recyclerview 中。
我意识到我使用的课程材料已经过时。我已经使用 AsynctaskLoader 来处理互联网连接问题,但现在在官方 Android 文档中,它说“从 Android P(API 28)开始不推荐使用加载器。在处理 Activity 和 Fragment 生命周期时处理加载数据的推荐选项是使用ViewModel 和 LiveData 的组合。”
我的问题是我应该转换我的代码以符合 ViewModels 和 LiveData 还是 Asynctask 处理我的任务(或任何其他建议)?正如我提到的,我只想从几个来源中提取新闻数据并将它们显示在应用程序中。看来我不需要数据存储功能。但是,现在我添加了两个新闻源,该应用程序似乎有点晚加载新闻数据。这种延迟是否与使用加载器有关?使用视图模型会加速新闻加载任务吗(特别是当有很多新闻源时)?
我目前正在玩弄fragment与ViewModel和相关的生命周期的窍门LiveData。
我有 2 fragments,fragmentA和fragmentB. 我Observer在onCreate每个fragment.
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sharedViewModel = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
sharedViewModel.getText().observe(this, new Observer<CharSequence>() {
@Override
public void onChanged(CharSequence charSequence) {
editText.setText(charSequence);
}
});
}
Run Code Online (Sandbox Code Playgroud)
每个fragment都有一个按钮,可以LiveData在共享中更改ViewModel
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
[...]
buttonOk.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sharedViewModel.setText(editText.getText());
}
});
[...]
}
Run Code Online (Sandbox Code Playgroud)
SharedViewModel …
android-fragments android-livedata android-viewmodel mutablelivedata
我在 Android 应用程序中使用 Dagger2 进行 DI,
我想在一个片段中注入 viewModelAndroidInjector并有这两行:
AndroidInjection.inject(this)
viewModel = ViewModelProviders.of(this, viewModelFactory).get(ProductDetailViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)
当我的片段扩展androidx.fragment.app.Fragment显示此错误时:
android.support.v4.app.Fragmentandroid.app.Fragment现在我不知道我的片段应该扩展哪一个!
选择其中之一时出现此错误:
None of the following functions can be called with the arguments supplied:
public open fun inject(activity: Activity!): Unit defined in dagger.android.AndroidInjection
public open fun inject(fragment: Fragment!): Unit defined in dagger.android.AndroidInjection
public open fun inject(service: Service!): Unit defined in dagger.android.AndroidInjection
public open fun inject(contentProvider: ContentProvider!): Unit defined in dagger.android.AndroidInjection
我目前正在调查Dagger2在我的 Android 应用程序中的使用。
implementation 'com.google.dagger:dagger:2.21'
annotationProcessor 'com.google.dagger:dagger-compiler:2.21'
implementation 'com.google.dagger:dagger-android:2.21'
implementation 'com.google.dagger:dagger-android-support:2.21'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.21'
Run Code Online (Sandbox Code Playgroud)
我已经设法查看@Inject模型及其相关的存储库
使用以下代码:-
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
@Singleton
public class DaggerViewModelFactory implements ViewModelProvider.Factory {
private final Map<Class<? extends ViewModel>, Provider<ViewModel>> creators;
@Inject
public DaggerViewModelFactory(final Map<Class<? extends ViewModel>, Provider<ViewModel>> creators) {
this.creators = creators;
}
@SuppressWarnings("unchecked")
@Override
public <T extends ViewModel> T create(final Class<T> modelClass) {
Provider<? extends ViewModel> creator = creators.get(modelClass);
if (creator == null) { …Run Code Online (Sandbox Code Playgroud) 我有一个活动,CoordinatorLayout其中包含一个CollapsingToolbarLayout. 我已将活动的标题绑定到 的title属性CollapsingToolbarLayout,如下所示(由于布局太大,仅发布代码的相关部分):
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable name="viewModel"
type="com.android.myapp.ui.activity.home.HomeActivityViewModel"/>
</data>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.drawerlayout.widget.DrawerLayout
android:id="@+id/drawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusableInTouchMode="true">
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/app_bar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_behavior="com.android.myapp.ui.behavior.scroll.appbar.DisableableAppBarLayoutBehavior"
android:fitsSystemWindows="true">
<com.google.android.material.appbar.CollapsingToolbarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
app:title="@{viewModel.pageTitle}"
app:collapsedTitleTextAppearance="@style/CollapsedAppBarTitleStyle"
app:contentScrim="?attr/colorPrimary"
app:expandedTitleGravity="bottom|center_horizontal"
app:expandedTitleMarginBottom="85dp"
app:expandedTitleTextAppearance="@style/ExpandedAppBarTitleStyle"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<!--Remaining layout-->
</layout>
Run Code Online (Sandbox Code Playgroud)
如您所见,该pageTitle属性绑定到 xmlCollapsingToolbarLayout title属性。
现在在HomeActivityViewModel:
class HomeActivityViewModel(application: Application) : AndroidViewModel(application) {
var isToolbarExpandable = MutableLiveData<Boolean>() // For handling the …Run Code Online (Sandbox Code Playgroud) android android-databinding android-livedata android-viewmodel android-architecture-components