问题描述
我在一个片段中使用 SwitchCompat,在那里我不断获取和未解析的引用,这些引用不允许我编译。 我不知道该去哪里看了.. 我相信我的 gradle 文件应该是怎样的,但我仍然怀疑是那里的东西.. 知道我可能做错了什么吗?
先谢谢你!!任何提示将不胜感激
我的 gradle 文件:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext.kotlin_version = "1.4.21"
ext.nav_version = '2.3.0'
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.1.1"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
还有:
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'androidx.navigation.safeargs.kotlin'
}
android {
compileSdkVersion 30
buildToolsversion "30.0.2"
defaultConfig {
applicationId "com.example.onemorepassword"
minSdkVersion 21
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'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinoptions {
jvmTarget = '1.8'
}
buildFeatures {
dataBinding true
}
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.3.2'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.2.1'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
//viewmodel
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'
}
我有我的 XML:
<?xml version="1.0" encoding="utf-8"?>
<layout 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">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/lowLetters_switch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="30dp"
android:checked="true"
android:fontFamily="@font/nunito_sans_bold"
android:text="@string/switchLowLetters"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/lengthSize_seekBar" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
我的片段:
package com.example.onemorepassword
import android.annotation.SuppressLint
import android.content.ClipData
import android.content.ClipboardManager
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.animation.Animation
import android.view.animation.AnimationUtils
import android.widget.Button
import android.widget.SeekBar
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.lifecycle.viewmodelProvider
import com.example.onemorepassword.databinding.OneMorePasswordFragmentBinding
class OneMorePasswordFragment : Fragment() {
private lateinit var binding: OneMorePasswordFragmentBinding
private lateinit var viewmodel: OneMorePasswordviewmodel
override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {
binding = DataBindingUtil.inflate<OneMorePasswordFragmentBinding>(inflater,R.layout.one_more_password_fragment,container,false)
viewmodel = viewmodelProvider(this).get(OneMorePasswordviewmodel::class.java)
//All fun that update UI from viewmodel
savedGeneratedPass()
return binding.root
}
override fun onViewCreated(view: View,savedInstanceState: Bundle?) {
super.onViewCreated(view,savedInstanceState)
**val myLowLetteRSSwitch = binding.lowLetteRSSwitch
myLowLetteRSSwitch.setonCheckedchangelistener { _,b ->
Toast.makeText(requireActivity(),b.toString(),Toast.LENGTH_SHORT).show(**)
}
......
More code...
....
**private fun switchLowLetters(): Boolean {
val myLowLetteRSSwitch= binding.lowLetteRSSwitch
return myLowLetteRSSwitch.isChecked
}**
....
More code...
最后是我的 mainActivity
package com.example.onemorepassword
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import com.example.onemorepassword.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//setContentView(R.layout.activity_main)
binding = DataBindingUtil.setContentView(this,R.layout.activity_main)
supportActionBar?.hide()
}
}
解决方法
您需要在 build.gradle (app) 文件中将 viewBinding true
添加到 buildFeatures
才能使用视图绑定。
只需替换:
buildFeatures {
dataBinding true
}
与:
buildFeatures {
dataBinding true
viewBinding true
}
,
发现发生了什么。一旦你知道了......!
我必须为相同的片段、纵向和横向创建 XML 文件。
忘了编辑我的 Landscape XML 文件...所以在一个我有
而在其他 XML 中我只有
也许这有助于有人在崩溃之前调查一下