【问题标题】:SwitchCompat Unresolved reference - Android KotlinSwitchCompat 未解决的参考 - Android Kotlin
【发布时间】:2025-12-11 01:30:01
【问题描述】:

我在一个片段中使用 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()
    }
}

【问题讨论】:

    标签: android kotlin switchcompat


    【解决方案1】:

    您需要在 build.gradle (app) 文件中将 viewBinding true 添加到 buildFeatures 才能使用视图绑定。

    只需替换:

    buildFeatures {
        dataBinding true
    }
    

    与:

    buildFeatures {
        dataBinding true
        viewBinding true
    }
    

    【讨论】:

    • 感谢您的帮助!不幸的是我仍然面临同样的问题......仍然得到未解决的参考:setOnCheckedChangeListener
    • 你的代码的哪一部分给出了编译错误?
    • 例如,我在 this isChecked private fun switchLowLetters() 中得到一个 Unresolved Reference: Boolean { val myLowLettersSwitch= binding.lowLettersSwitch return myLowLettersSwitch.isChecked }
    • 找出它是什么@mhdwajeeh.95 我忘了编辑我有 Switch 而不是 com.google.android.material.switchmaterial.SwitchMaterial 的横向 XML 文件.....
    【解决方案2】:

    发现发生了什么。一旦你知道它..!

    我必须为相同的片段、纵向和横向生成 XML 文件。 忘了编辑我的景观 XML 文件.... 所以在一个我有 (或兼容,没关系)

    在其他 XML 中我只有

    也许这可以让某人在崩溃之前对其进行调查

    【讨论】: