【问题标题】:Data Binding Android - Type parameter T has incompatible upper bounds : ViewDataBinding and MainActivity数据绑定 Android - 类型参数 T 具有不兼容的上限:ViewDataBinding 和 MainActivity
【发布时间】:2016-03-25 21:54:46
【问题描述】:

我正在使用 Android Studio 2.0 Preview 4。 我正在使用 Android SDK 工具 25 rc1。无论我清理/重建项目多少次,此错误都会持续存在。 File-> Invalidate Caches and restart 也不起作用。 我无法运行最基本的数据绑定示例。

build.gradle 文件

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.example.chiragshenoy.myapplication"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    dataBinding {
        enabled = true
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'
}

MainActivity.java

package com.example.chiragshenoy.myapplication;

import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MainActivity binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        User user = new User("Test", "User");
        binding.setUser(user);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable name="user" type="com.example.chiragshenoy.myapplication.User"/>
    </data>
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.firstName}"/>
        <TextView android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.lastName}"/>
    </LinearLayout>
</layout>

这是我的顶级 build.gradle 文件

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.0.0-alpha3'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

【问题讨论】:

  • 您可能想为 gradle、xml 和活动添加代码!
  • 您的Gradle 版本是多少? (非插件版)可以在app找到(右键)->Open Module Settings->Project
  • 我在更新 android 插件和 Gradle 时发现了这个问题,只需使缓存无效并重新启动即可解决。

标签: android data-binding android-databinding


【解决方案1】:

如果你的 gradle 版本没问题(1.5+)那么你应该试试这个:

  1. 转到您的“some_layout.xml”
  2. 点击右键 -> 重构 -> 重命名(或 SHIFT + F6)
  3. 例如将布局重命名为“some_layout2.xml”
  4. 将此文件重命名回原来的“some_layout.xml”

这可能会解决问题。让我们知道。

【讨论】:

  • 重命名后生效。这种bug应该马上解决。
  • 我升级到 gradle 2.2.3 并且这个错误出现在我面前。上面的修复对我有用!我猜这会导致 IDE 正确地重新生成代码。
  • 为我工作,但为什么会出现这个问题?如果我清理并重建项目,为什么它不会消失?
  • Android Gradle 插件仍然存在此错误:2.3.0-beta4。
  • 这是什么Bug?
【解决方案2】:

这个解决方案对我有用“文件 -> 使缓存无效/重新启动” https://stackoverflow.com/a/32191257/2205809

【讨论】:

    【解决方案3】:

    有一个简单的解决方案。

    1. 点击android studio工具栏上的“文件”
    2. 点击“Invalidate Caches and Restart”,就可以了。

    希望这个答案对你有所帮助。

    【讨论】:

    • 欢迎来到 SO!当您发布答案时,请尝试稍微解释一下,此外,在您的情况下,您再次给出的答案是未附加的图像。即使是对的。
    【解决方案4】:

    你应该使用:

    ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
    

    在 onCreate 中

    MainActivity 不是生成的 Binding 类。

    【讨论】:

      【解决方案5】:

      我只是根据 Felipe Gualberto 的 Answer 想到的,我得到了解决方案的不同方式。

      如果您在不同的 XML 中编写了具有相同 id 的多个视图,则使其唯一。

      谢谢。

      【讨论】:

        【解决方案6】:

        我使用的最快的 hack 之一是将 xml 文件重命名为。

        例如

        abc_layout.xml 重命名为abc_layout2.xml。一旦绑定导入显示错误,将其重命名为abc_layout.xml

        重命名的捷径是shift + F6。整个项目的重建速度更快。但这只会从一个文件中删除错误。

        【讨论】:

          【解决方案7】:

          默认情况下,会根据布局文件的名称生成一个Binding类,将其转换为Pascal大小写,并为其添加“Binding”后缀。上面的布局文件是ma​​in_activity.xml,所以生成的类是MainActivityBinding。问题是您正在尝试手动创建绑定类。

          这个类包含从布局属性(例如用户变量)到布局的Views 的所有绑定,并且知道如何为绑定表达式分配值。创建绑定的最简单方法是在充气时进行。 无需重启 Android Studio。

          【讨论】:

            【解决方案8】:

            在顶层 Build.Gradle 文件中使用 gradle 1.5.0 或更高版本

             dependencies {
                classpath 'com.android.tools.build:gradle:1.5.0'
            }
            

            如果它低于 1.5.0,那么在顶级 gradle 文件中也使用这个

                    classpath "com.android.databinding:dataBinder:1.0-rc4"
            

            【讨论】:

            • 他似乎已经在使用 1.5+ .. 我认为这不是问题所在。
            • 也试过 1.5.0。那也行不通。同样的错误。
            【解决方案9】:

            只需尝试使缓存无效/从文件重新启动。这对我有用。

            【讨论】:

              【解决方案10】:

              Migrating my existing project to AndroidX 之后我也遇到了同样的问题,我通过以下方式解决了它

              Build -> Clean Project
              Build -> Rebuild Project
              

              之后

              File -&gt; Invalidate Caches/Restart...

              【讨论】:

                【解决方案11】:

                我通过用&lt;layout&gt; 标记包围我的xml 布局文件来修复此错误

                your_layout.xml 文件应该类似于

                <?xml version="1.0" encoding="utf-8"?>
                <layout xmlns:android="http://schemas.android.com/apk/res/android">
                
                <androidx.appcompat.widget.AppCompatTextView
                        android:id="@+id/view_textView"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"/>
                </layout>
                

                这对我有用。

                【讨论】:

                  【解决方案12】:

                  这样做

                  ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
                  

                  代替

                  MainActivity binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
                  

                  【讨论】:

                    【解决方案13】:

                    查看绑定类的名称,这里ActivityMainInitBinding是根据xml文件activity_mail_init.xml生成的。如果你使用了错误的类,就会弹出错误。

                      val binding : ActivityMainInitBinding=
                            DataBindingUtil.setContentView(this, R.layout.activity_main_init)
                    

                    【讨论】:

                      【解决方案14】:

                      迁移到 AndoridX 后,您需要从 XMl 中删除旧的 v4 或 v7 小部件。例如 - 如果您使用某些 AppCompat 小部件,则需要替换

                      <android.support.v7.widget.AppCompatTextView
                                      android:layout_width="wrap_content"
                                      android:layout_height="wrap_content"
                                      android:textSize="11sp"
                                      android:layout_alignParentRight="true"
                                      android:layout_alignParentBottom="true"
                                      android:tag="showMore"/>
                      

                      用 andoridx 小部件替换它

                        <androidx.appcompat.widget.AppCompatTextView
                                      android:id="@+id/txt_summary_desc_more"
                                      android:layout_width="wrap_content"
                                      android:layout_height="wrap_content"
                                      android:textSize="11sp"
                                      android:layout_alignParentRight="true"
                                      android:layout_alignParentBottom="true"
                                      android:text="Read More"/>
                      

                      对我来说效果很好。

                      【讨论】:

                        【解决方案15】:

                        如果继续出错,刷新是没有用的。 当出现这些错误时,很可能在您的 xml 文件中存在编译器在创建布局时没有向您显示的问题。 实际上,可能会发生此错误仅在其“调试”文件夹中可见。如果出现这种类型的错误,只需按照调试文件夹中的错误并从原始文件中更正即可。 在我的情况下,错误是两个重复的

                         

                        xmlns: app = "http://schemas.android.com/apk/res-auto"

                        我看不到

                        【讨论】:

                          【解决方案16】:

                          删除模块级build 文件夹并重新打开您的项目。

                          【讨论】:

                            【解决方案17】:

                            我收到此错误是因为我错过了视图 xml 中的标签,但这里不是这种情况。

                            【讨论】:

                              猜你喜欢
                              • 2018-05-05
                              • 2015-11-17
                              • 1970-01-01
                              • 2020-02-16
                              • 2013-08-15
                              • 2020-11-26
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              相关资源
                              最近更新 更多