数据绑定 Android - 类型参数 T 具有不兼容的上限:ViewDataBinding 和 MainActivity
Posted
技术标签:
【中文标题】数据绑定 Android - 类型参数 T 具有不兼容的上限:ViewDataBinding 和 MainActivity【英文标题】:Data Binding Android - Type parameter T has incompatible upper bounds : ViewDataBinding and 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_
android:layout_>
<TextView android:layout_
android:layout_
android:text="@user.firstName"/>
<TextView android:layout_
android:layout_
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 时发现了这个问题,只需使缓存无效并重新启动即可解决。
【参考方案1】:
如果你的 gradle 版本没问题(1.5+)那么你应该试试这个:
-
转到您的“some_layout.xml”
点击右键 -> 重构 -> 重命名(或 SHIFT + F6)
例如将布局重命名为“some_layout2.xml”
将此文件重命名回原来的“some_layout.xml”
这可能会解决问题。让我们知道。
【讨论】:
重命名后生效。这种bug应该马上解决。 我升级到 gradle 2.2.3 并且这个错误出现在我面前。上面的修复对我有用!我猜这会导致 IDE 正确地重新生成代码。 为我工作,但为什么会出现这个问题?如果我清理并重建项目,为什么它不会消失? Android Gradle 插件仍然存在此错误:2.3.0-beta4。 这是什么Bug?【参考方案2】:这个解决方案对我有用“文件 -> 使缓存无效/重新启动” https://***.com/a/32191257/2205809
【讨论】:
【参考方案3】:有一个简单的解决方案。
-
点击android studio工具栏上的“文件”
点击“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”后缀。上面的布局文件是main_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 -> Invalidate Caches/Restart...
【讨论】:
【参考方案11】:我通过用<layout>
标记包围我的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_
android:layout_/>
</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_
android:layout_
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_
android:layout_
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 中的标签,但这里不是这种情况。
【讨论】:
以上是关于数据绑定 Android - 类型参数 T 具有不兼容的上限:ViewDataBinding 和 MainActivity的主要内容,如果未能解决你的问题,请参考以下文章
使用 Kotlin 和泛型进行数据绑定。错误:不兼容的类型:对象无法转换为列表