代码之家  ›  专栏  ›  技术社区  ›  Serj

找不到符号类准则

  •  0
  • Serj  · 技术社区  · 7 年前

    我开始用最新的Androidx和Jetpack以及数据绑定创建一个新项目。一切都很好,除了我用 androidx.constraintlayout 具有 databinding . 自动生成的数据绑定类无法为导入正确的包 Guideline 班级。它正试图从 androidx.constraintlayout.Guideline 事实上,阶级存在于 androidx.constraintlayout.Widget.Guideline .

    预期行为

    AndroidStudio应该从 androidx.constraintlayout.widget.guideline指南 而不是 androidx.constraintlayout.guideline.指南 它应该编译得很好。

    当前行为

    编译器引发以下错误:

    • 找不到符号类准则

    可能的解决方案

    我可以停止在指南类中使用数据绑定,但是…因为它是一个自动生成的数据绑定类,所以我也不能更改导入包,因为在构建时,它将被生成并再次覆盖。我不确定是否有任何方法可以强制android studio从正确的包中导入。

    更新:

    我确实停止了使用我从另一个开发人员那里得到的指导方针,并且意识到没有这些指导方针我是完全没用的。不过,我认为这仍然是安卓系统的一个缺陷。

    复制的步骤

    为Android项目启用数据绑定:

    dataBinding {
            enabled = true
    }
    

    导入我还使用的以下Androidx库:

    /**
     * AndroidX Libraries
     */
    implementation 'androidx.core:core-ktx:1.0.1'
    implementation 'androidx.fragment:fragment:1.0.0'
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation 'androidx.recyclerview:recyclerview:1.0.0'
    implementation 'com.google.android.material:material:1.0.0'
    implementation 'androidx.preference:preference:1.1.0-alpha01'
    implementation 'androidx.lifecycle:lifecycle-viewmodel:2.0.0'
    implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    

    用数据绑定创建一个片段我的情况是:

    <?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"
        tools:context=".fragments.emailConfirmation.EmailConfirmationFragment">
    
        <data>
    
            <import type="androidx.fragment.app.Fragment" />
    
            <variable
                name="viewModel"
                type="android.thespikeapp.com.spike.fragments.emailConfirmation.EmailConfirmationViewModel" />
        </data>
    
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
            <androidx.constraintlayout.widget.ConstraintLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:focusableInTouchMode="true">
    
                <androidx.constraintlayout.Guideline
                    android:id="@+id/image_left_guideline"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:orientation="vertical"
                    app:layout_constraintGuide_percent=".33" />
    
                <androidx.constraintlayout.Guideline
                    android:id="@+id/image_right_guideline"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:orientation="vertical"
                    app:layout_constraintGuide_percent=".66" />
    
                <androidx.constraintlayout.Guideline
                    android:id="@+id/text_left_guideline"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:orientation="vertical"
                    app:layout_constraintGuide_percent=".16" />
    
                <androidx.constraintlayout.Guideline
                    android:id="@+id/text_right_guideline"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:orientation="vertical"
                    app:layout_constraintGuide_percent=".84" />
    
                <ImageView
                    android:id="@+id/imageView"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="48dp"
                    app:layout_constraintBottom_toTopOf="@id/horizontalGuideline"
                    app:layout_constraintEnd_toEndOf="@id/image_right_guideline"
                    app:layout_constraintStart_toStartOf="@id/image_left_guideline"
                    app:layout_constraintTop_toTopOf="parent" />
                <!--android:src="@drawable/ic_confirm_email"-->
    
                <TextView
                    android:id="@+id/textView"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="48dp"
                    android:gravity="center_horizontal"
                    android:text="@string/confirm_email_description"
                    android:textColor="@android:color/black"
                    android:textSize="18sp"
                    app:layout_constraintEnd_toEndOf="@id/text_right_guideline"
                    app:layout_constraintStart_toStartOf="@id/text_left_guideline"
                    app:layout_constraintTop_toBottomOf="@id/imageView" />
    
                <androidx.constraintlayout.Guideline
                    android:id="@+id/horizontalGuideline"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal"
                    app:layout_constraintGuide_percent="0.35" />
    
                <com.google.android.material.textfield.TextInputLayout
                    android:id="@+id/textInputLayout"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="24dp"
                    android:textColorHint="@color/colorPrimaryLightest"
                    app:layout_constraintEnd_toEndOf="@id/text_right_guideline"
                    app:layout_constraintStart_toStartOf="@id/text_left_guideline"
                    app:layout_constraintTop_toBottomOf="@id/textView">
    
                    <com.google.android.material.textfield.TextInputEditText
                        android:id="@+id/emailAddressEditText"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:gravity="center_horizontal"
                        android:hint="@string/email_address"
                        android:inputType="textEmailAddress"
                        android:maxLines="1"
                        android:text="@={viewModel.email}"
                        android:textSize="18sp" />
    
                </com.google.android.material.textfield.TextInputLayout>
    
                <Button
                    android:id="@+id/updateButton"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="48dp"
                    android:text="@string/submit"
                    android:textAllCaps="false"
                    app:layout_constraintEnd_toEndOf="@id/text_right_guideline"
                    app:layout_constraintStart_toStartOf="@id/text_left_guideline"
                    app:layout_constraintTop_toBottomOf="@id/textInputLayout" />
    
    
            </androidx.constraintlayout.widget.ConstraintLayout>
    
        </FrameLayout>
    </layout>
    

    尝试构建应用程序,你会得到相同的错误

    环境

    此代码不会使用Kotlin1.3.10在AndroidStudio版本3.2.1上编译。minsdkversion设置为21并编译dkversion 28。

    感谢您的帮助!

    1 回复  |  直到 7 年前
        1
  •  0
  •   Serj    7 年前

    @Commonware指出了一些我完全忽略的东西,我的布局文件包含 androidx.constraintlayout.Guideline 而不是 androidx.constraintlayout.Widget.Guideline 解决了问题。但是,我猜当我使用重构工具迁移到androidx时,它将指导性标签转换为初始标签,而不是后者。感谢Commonware指出了这个愚蠢的错误!