【发布时间】:2020-08-08 09:45:16
【问题描述】:
我正在学习使用 Kotlin 进行 Android 开发,遇到了一个我无法解决的问题。
运行构建时出现以下错误:
代码\DiceRoller\app\src\main\java\com\example\diceroller\MainActivity.kt: (16, 34):未解决的参考:rollButto
这是我的 MainActivity.kt 代码:
package com.example.diceroller
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.Toast
import com.example.diceroller.databinding.DiceRollerMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var binding: DiceRollerMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DiceRollerMainBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
val rollButton = binding.rollButton
// this.binding.rollButton.setOnClickListener {
// Toast.makeText(this, "Button Clicked!", Toast.LENGTH_SHORT).show()
// }
}
}
一切正常,直到尝试访问滚动按钮,它会产生参考错误,即使它出现在自动完成中。我也尝试访问另一个元素,它产生了同样的错误。
这是我的 xml 文件 (dice_roller_main.xml):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:andriod="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.andriod.com/tools"
andriod:layout_height="wrap_content"
andriod:layout_width="match_parent"
andriod:orientation="vertical"
tools:context=".MainActivity"
andriod:layout_gravity="center_vertical">
<TextView
andriod:id="@+id/name"
andriod:layout_width="wrap_content"
andriod:layout_height="wrap_content"
andriod:text="1"
andriod:layout_gravity="center_horizontal"
andriod:textSize="30sp"/>
<Button
andriod:id="@+id/roll_button"
andriod:layout_width="wrap_content"
andriod:layout_height="wrap_content"
andriod:text="@string/ButtonRoll"
andriod:layout_gravity="center_horizontal"/>
</LinearLayout>
我确保在 gradle build 中打开视图绑定
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 30
buildToolsVersion "30.0.0"
defaultConfig {
applicationId "com.example.diceroller"
minSdkVersion 19
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
buildFeatures {
viewBinding true
}
}
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.3.0'
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
有人遇到过这个问题吗?我已尝试在此处和谷歌上搜索此问题,但找不到与我有类似问题的人。
编辑:
我已经完成了生成的绑定类,看起来在 xml 中定义的按钮和文本视图没有生成代码
// Generated by view binder compiler. Do not edit!
package com.example.diceroller.databinding;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.viewbinding.ViewBinding;
import com.example.diceroller.R;
import java.lang.NullPointerException;
import java.lang.Override;
public final class DiceRollerMainBinding implements ViewBinding {
@NonNull
private final LinearLayout rootView;
private DiceRollerMainBinding(@NonNull LinearLayout rootView) {
this.rootView = rootView;
}
@Override
@NonNull
public LinearLayout getRoot() {
return rootView;
}
@NonNull
public static DiceRollerMainBinding inflate(@NonNull LayoutInflater inflater) {
return inflate(inflater, null, false);
}
@NonNull
public static DiceRollerMainBinding inflate(@NonNull LayoutInflater inflater,
@Nullable ViewGroup parent, boolean attachToParent) {
View root = inflater.inflate(R.layout.dice_roller_main, parent, false);
if (attachToParent) {
parent.addView(root);
}
return bind(root);
}
@NonNull
public static DiceRollerMainBinding bind(@NonNull View rootView) {
if (rootView == null) {
throw new NullPointerException("rootView");
}
return new DiceRollerMainBinding((LinearLayout) rootView);
}
}
【问题讨论】:
-
你的 XML 布局文件名是什么?
-
dice_roller_main.xml
-
你的代码好像没问题,试着把你的XML文件名改成activity_main。 xml 和访问,如 ActivityMainBinding。它只是一个简单的尝试。
-
试过了,结果一样。
-
您可以在访问时执行类似绑定的操作吗?.rollButton。不确定,但有时需要可空运算符来访问确切的属性。
标签: android kotlin android-viewbinding