SwitchCompat 未解析参考 - Android Kotlin

问题描述

我在一个片段中使用 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 中我只有

也许这有助于有人在崩溃之前调查一下