【问题标题】:Type error on ViewModelProviders#of(Fragment)ViewModelProviders#of(Fragment) 上的类型错误
【发布时间】:2023-04-03 14:03:01
【问题描述】:

我正在尝试通过google tutorial on building good ap architecture。我正在使用 java 8 和 SDK 26。 这是我到目前为止的代码:

package test.me;

import android.app.Fragment;
import android.arch.lifecycle.ViewModel;
import android.arch.lifecycle.ViewModelProviders;
import android.os.Bundle;
import android.support.annotation.Nullable;

public class ChronoFragment extends Fragment {

    private ViewModel my_model;

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        my_model = ViewModelProviders.of(this).get(ViewModel.class);  // <-- error on this
        // and so on
    }
}

麻烦的是,到目前为止,SDK返回以下错误:

Cannot resolve the method 'of(test.me.ChronoFragment)'.

我不明白,因为

  • ChronoFragment 属于 Fragment 类型
  • 方法 ViewModelProviders#of(Fragment) does exist 可通过 sdk 访问。

知道我做错了什么吗?

【问题讨论】:

    标签: java android android-fragments


    【解决方案1】:

    架构组件使用来自支持库的 appcompat Fragment,而不是原生库。尝试将 Fragment 的导入更改为

    import android.support.v4.app.Fragment;
    

    由于历史原因,有两个不同的Fragment 类。它们具有相同的功能,但存在于两个不同的包中。详情见Why are there two Fragment classes in Android?

    截至 2019 年 2 月 6 日:

    现在有第三个Fragment 类。如果您使用的是新的 AndroidX 库,请这样做

    import androidx.fragment.app.Fragment;
    

    确保使用与其余依赖项一致的正确 Fragment 类。

    【讨论】:

    • @fxm 你需要小心你的应用程序的其余部分。我的建议是始终如一地使用支持Fragment 类,这样您就不会在其他地方遇到类似问题。
    • 我会这样做,但我承认我对看起来像重复的东西有点困惑。我想我必须阅读更多内容
    • @fxm 你的意思是什么重复?你指的是Fragment这两个类吗?
    • 是的,组件在阅读文档时似乎几乎是普通的 android,但是,存在与原始代码中的片段类有些不同
    • @fxm 希望this 能解决一些困惑。有两个Fragment 类的主要原因是历史原因。
    【解决方案2】:

    我也遇到过同样的问题,谷歌文档没有告诉你的是,你需要将以下依赖项添加到你的 Build Gradle 文件中,然后“同步”

    implementation "android.arch.lifecycle:extensions:1.1.1"
    annotationProcessor "android.arch.lifecycle:compiler:1.1.1"
    

    【讨论】:

    【解决方案3】:

    我在使用 Android X 库时遇到了同样的问题,并使用以下方法解决了。

    Android X 的 Gradle 依赖项:

    implementation "androidx.lifecycle:lifecycle-extensions:2.1.0-alpha04"
    annotationProcessor "androidx.lifecycle:lifecycle-compiler:2.1.0-alpha04"`
    

    导入:

    import androidx.lifecycle.ViewModelProvider;
    import androidx.lifecycle.ViewModel;
    

    参考 - https://developer.android.com/jetpack/androidx/migrate

    【讨论】:

      【解决方案4】:

      我也遇到了同样的问题,android studio 自动导入了android.support.v4.app.Fragment;,但是我用的是androidX。如果您的情况相同,则必须使用 androidX 到处导入

      import androidx.fragment.app.Fragment;
      

      【讨论】:

        猜你喜欢
        • 2019-11-10
        • 2023-03-03
        • 2019-02-27
        • 1970-01-01
        • 1970-01-01
        • 2012-08-02
        • 1970-01-01
        • 2015-06-13
        • 1970-01-01
        相关资源
        最近更新 更多