标签: android-viewmodel

从ViewModel访问strings.xml

我正在使用Dagger 2 DataBindng和新的Android Lifecycle组件,这些组件具有ViewModels

在我的内部,ViewModel如何访问我的strings.xml?我在想,在第一,注入ContextviewModel,然而,这只会泄漏内存。

还有其他方法吗?

android android-context dagger-2 android-viewmodel android-architecture-components

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

如何将视图模型绑定到底板

我试图弄清楚如何将视图模型绑定到底部表,以便我可以使用视图模型上的可观察字段使底部表同时展开、折叠和隐藏。

谢谢!

android bottom-sheet android-viewmodel

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

无法解析符号ViewModelProviders

我正在研究Android ViewModel架构组件,但在尝试初始化AppCompatActivity中的ViewModel时遇到上述错误.

import android.arch.lifecycle.ViewModelProviders;
ViewModelProviders.of(this).get(CounterViewModel.class);
Run Code Online (Sandbox Code Playgroud)

有一些与此相关的问题和文章,他们指出在app gradle文件中添加lifecycle:extensionslifecycle: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)

在此输入图像描述

android android-viewmodel

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

如何从 Worker 类中获取 ViewModel?

  1. 我的Activivity应用程序中有一个名为 MainActivity 的应用程序。
  2. MainActivity 与ViewModelOnCreate 方法中的a 相关联

    ...
    val someViewModel = ViewModelProviders.of(this).get(SomeViewModel::class.java)
    ...
    
    Run Code Online (Sandbox Code Playgroud)
  3. 我做了一些背景工作Workers

    val someWork = OneTimeWorkRequestBuilder<LoginWorker>().build() WorkManager.getInstance().beginUniqueWork("SOMEWORK", ExistingWorkPolicy.REPLACE, captivePortalWork).enqueue()

  4. 问题来了……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)

    我怎样才能ViewModelWorker课堂上获得一个?

android android-viewmodel android-architecture-components android-workmanager

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

在 Viewpager 中使用具有相同 ViewModel 的相同 Fragment 的多个实例时出现问题

我有一个带有视图模型 (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

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

从 Android P (API 28) 开始,Android Studio Loaders 已被弃用?

我是 Android 新手,我已经完成了一些 Android 应用程序开发课程,现在我正在尝试应用我学到的知识。我为它选择了一个新闻应用程序。它将从 5-10 个来源中提取新闻并将它们显示在 recyclerview 中。

我意识到我使用的课程材料已经过时。我已经使用 AsynctaskLoader 来处理互联网连接问题,但现在在官方 Android 文档中,它说“从 Android P(API 28)开始不推荐使用加载器。在处理 Activity 和 Fragment 生命周期时处理加载数据的推荐选项是使用ViewModel 和 LiveData 的组合。”

我的问题是我应该转换我的代码以符合 ViewModels 和 LiveData 还是 Asynctask 处理我的任务(或任何其他建议)?正如我提到的,我只想从几个来源中提取新闻数据并将它们显示在应用程序中。看来我不需要数据存储功能。但是,现在我添加了两个新闻源,该应用程序似乎有点晚加载新闻数据。这种延迟是否与使用加载器有关?使用视图模型会加速新闻加载任务吗(特别是当有很多新闻源时)?

android loader android-asynctask android-viewmodel

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

删除 + 添加后片段未收到 LiveData 更新

我目前正在玩弄fragmentViewModel和相关的生命周期的窍门LiveData

我有 2 fragments,fragmentAfragmentB. 我ObserveronCreate每个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

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

为什么 AdnroidInjector.inject(fragment) 使用已弃用的 android.support.v4.app.Fragment

我在 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.Fragment
  • 但第二次使用 android.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

android dagger-2 androidinjector android-viewmodel

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

如何使用 Dagger2 @Inject AndroidViewModel?

我目前正在调查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)

android dagger-2 android-viewmodel

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

MutableLiveData 的 Android XML 绑定不起作用

我有一个活动,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

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