ไม่ได้สร้างคลาสการผูกข้อมูล


104

ฉันใช้การผูกข้อมูลในโปรเจ็กต์ของฉันเมื่อใช้<layout>และ<data>ในคลาสการโยง xml ของฉันจะไม่ถูกสร้างขึ้น

ตัวอย่างเช่นฉันมี activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>    </data>
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </RelativeLayout>
</layout>

ตอนนี้ถ้าฉันเขียนActivityMainBindingในกิจกรรม / ส่วนของฉันมันแสดงข้อผิดพลาดว่าคลาสไม่พร้อมใช้งาน แต่หลังจากรวม<variable>ในไฟล์ xml ของฉันแล้วก็สามารถสร้างActivityMainBindingคลาสได้

Android Studio: 2.1.3
Classpath: com.android.tools.build:gradle:2.1.3
minSdkVersion 16
targetSdkVersion 24
buildToolsVersion 24.0.0


2
อยู่dataBinding.enabledใน build.gradle ของคุณหรือไม่
pskink

2
ฉันคิดว่านี่เป็นข้อผิดพลาดที่ทราบ คุณสามารถลองสร้างโปรเจ็กต์ของคุณก่อนที่จะพยายามเข้าถึงActivityMainBindingหรือต้องทำอะไรบางอย่างกับจุดบกพร่องนี้
yennsarah

@pskink ใช่แล้วนั่นคือสาเหตุที่สร้างคลาสการผูกหลังจากเพิ่ม<variable>xml
ราวี

@Amylinn หลังจากสร้างโครงการของฉันมันสร้างขึ้น แต่คำถามของฉันคือเมื่อฉันเขียน<variable>มันจะสร้างคลาสที่มีผลผูกพันโดยไม่ต้องสร้างโครงการ
ราวี

1
ฉันสับสนเกี่ยวกับคำถามที่แท้จริง? ถ้าการเพิ่ม <variable> สามารถแก้ปัญหาได้ทำไมคุณไม่ทำ ฉันไม่เข้าใจจุดผูกมัดหากไม่มี ViewModel (<variable>)
ktutnik

คำตอบ:


244

ฉันไม่ได้รับคำตอบที่น่าพอใจ ดังนั้นนี่คือเคล็ดลับที่สรุปความรู้เกี่ยวกับการผูกข้อมูลของฉัน

เคล็ดลับในการแก้ปัญหา DataBinding

อัปเดต

เพื่อให้ได้ข้อผิดพลาดและคำแนะนำที่แม่นยำยิ่งขึ้นเราขอแนะนำอย่างยิ่งให้อัปเดตเวอร์ชันปลั๊กอิน Android Studio และ Gradle เป็นเวอร์ชันล่าสุด เนื่องจากฉันไม่ได้เผชิญกับปัญหามากมายหลังจากเวอร์ชัน AS 3.2

ดูล่าสุด Android สตูดิโอและปลั๊กอิน Gradle ล่าสุด

โซลูชัน Orignal

หลังจากที่ได้อ่านคำตอบนี้คุณจะไม่ได้รับการติดอยู่ในการผูกข้อมูลปัญหารุ่นรถยนต์สำหรับทั้งชั้นเรียนและตัวแปรข้อมูล

ตรวจสอบจุดเหล่านี้ทีละรายการ สิ่งเหล่านี้สามารถทำให้งานของคุณสำเร็จลุล่วง จุดที่ 3 ถึงสุดท้ายมีความสำคัญมากดังนั้นอย่าพลาด

1. ตรวจสอบว่าเปิดใช้งานการผูกข้อมูลหรือไม่

คุณควรเปิดใช้งานการผูกข้อมูลในbuild.gradle. ถ้าไม่ได้แล้วเพิ่มนี้และซิงค์

android {
    ...
    buildFeatures {
        dataBinding true
    }
}

2. เค้าโครงตรวจสอบถูกแปลงในรูปแบบการผูก

ตอนนี้ถ้าคุณต้องการสร้างคลาสการผูกข้อมูลคุณควรพันxml layoutด้วยการผูกข้อมูล ( <layoutแท็ก) อะไรทำนองนี้.

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.constraint.ConstraintLayout>
</layout>

พร้อมกับตรวจสอบว่าชื่อตัวแปรการผูกถูกต้องตามในคลาสโมเดลมุมมองหรือไม่

3. สร้างชื่อคลาส Binding โดยอัตโนมัติ?

ควรสร้างคลาสการผูกข้อมูลของคุณหลังจากสร้างเลย์เอาต์การผูก

หากชื่อรูปแบบของคุณอยู่ในกรณีที่งู activity_main.xmlแล้วผูกข้อมูลระดับจะได้รับการสร้างขึ้นในกรณีอูฐActivityMainBindingเช่น

4. ไม่เห็นคำแนะนำการนำเข้า?

บางครั้งเมื่อคุณพิมพ์ActivityMai...แล้วมันไม่ได้แสดงข้อเสนอแนะในการที่กรณีที่ตนเองนำเข้า

import <yourpackage>databinding.ActivityMainBinding;

5. อ่าน Build Fail Logcat

คลาสการผูกของคุณและตัวแปรใหม่ในเค้าโครงจะไม่ถูกสร้างขึ้นหากบิวด์ของคุณล้มเหลว ดังนั้นก่อนโครงการ MakeโดยCtrl + F9 (รูปร่าง> โครงการ Make)

  • หากการสร้างล้มเหลวให้ดูว่าอะไรคือข้อผิดพลาดโดยปกติแล้วเราจะมีข้อผิดพลาดในช่องเค้าโครง บันทึกข้อผิดพลาดจะระบุหมายเลขบรรทัดข้อผิดพลาดที่มีปัญหา
  • การเชื่อมโยงอาจล้มเหลวทำให้เกิดข้อผิดพลาดโง่ๆ เช่นข้อผิดพลาดทางไวยากรณ์หรือการนำเข้าที่ขาดหายไป ในกรณีนั้นคุณจะได้รับ Logcat ที่เต็มไปด้วยข้อผิดพลาดของคลาสที่มีผลผูกพัน แต่คุณควรอ่าน logcat สมบูรณ์เพื่อหาปัญหาที่เหมาะสม

6. ปิดและเปิดโครงการจากล่าสุด

ฉันมักจะทำเช่นนี้เพราะใช้เวลาน้อยกว่าRebuild/ Makeโครงการมาก

  • ปิดโปรเจ็กต์จากไฟล์> ปิดโปรเจ็กต์
  • เปิดอีกครั้งจากล่าสุด

โปรดทราบว่าฉันชอบปิดและเปิดจากล่าสุดเพราะใช้เวลาน้อยกว่าการสร้าง / รีสตาร์ท IDEมาก

7. สร้างโครงการใหม่

หากยังไม่สร้างชั้นเรียนของคุณ (บางครั้งเมื่อเราวางไฟล์เค้าโครงแล้วมันจะเกิดขึ้น) จากนั้นสร้างโครงการใหม่จากBuild> Rebuild( ไม่ใช่สร้างหรือสร้างโครงการ ) มันจะสร้างคลาสการผูกข้อมูลของคุณ ( สร้างเวทมนตร์ให้ฉันใหม่ )

8. มี Android Studio ล่าสุด

หลังจากอัปเดต AS เป็นAndroid Studio 3.2ฉันรู้สึกว่ามีการแก้ไขข้อบกพร่องหลายอย่างในการสร้างข้อมูลโดยอัตโนมัติ ดังนั้นคุณควรมี AS ล่าสุดด้วย

# โซลูชั่นสำหรับ <variables

<data>
    <variable
        name="item"
        type="com.package.Model"/>
</data>

โดยปกติแล้วเมื่อเราใส่ตัวแปรในเลย์เอาต์มันจะสร้าง getter และ setter ของมัน และเราสามารถใช้binding.setItem(item);และbinding.getItem();แต่ถ้าคุณไม่เห็นวิธีการเหล่านั้นให้อ่านข้อมูลด้านล่าง

1. ปิดและเปิดโครงการจากล่าสุด

หากคุณสร้างตัวแปรข้อมูล - <variableในเค้าโครงของคุณและไม่แสดงตัวตั้งค่าและเริ่มต้นในคลาสการผูกข้อมูลให้ปิดและเปิดจากโครงการล่าสุดของคุณ

2. โครงการทำความสะอาดหลังจากเปลี่ยนชนิด

หากคุณเปลี่ยนประเภทของบางส่วน<variableในเค้าโครงของคุณและประเภทตัวตั้งค่า getter ไม่เปลี่ยนแสดงว่าClean project ( Build> Clean Project)

คำสุดท้าย

สุดท้ายถ้ายังไม่สร้างคลาสผูกพันของคุณเราก็มีอาวุธที่ทรงพลังที่สุดของเรา - รีสตาร์ท Android Studio: D

  • ขั้นแรกให้ลองรีสตาร์ทสิ่งนี้จะสร้างตัวแปรของเลย์เอาต์การผูกของฉันเสมอหลังจากรีสตาร์ท
  • ถ้ามันไม่ได้ทำงานแล้วโมฆะแคชและเริ่มต้นใหม่

นี่คือทั้งหมดที่ฉันทำเพื่อแก้ไขข้อผิดพลาดในการผูกข้อมูล หากพบปัญหาเพิ่มเติมสามารถแสดงความคิดเห็นได้ที่นี่


2
หากปัญหายังคงอยู่ ... (8) ไม่ถูกต้องและรีสตาร์ท .... ถ้าไม่ได้รับการแก้ไข (9) เปลี่ยน dataBinding {enable = false} ... build จากนั้น dataBinding {enable = true} build อีกครั้ง ....
PravyNandas


1
ในกรณีของฉันฉันต้องนำเข้า classpath ด้วยตนเองด้วยเหตุผลบางประการ IDE ไม่แสดงสิ่งนี้เป็นวิธีแก้ปัญหา Tnx :)
Ivan Kaloyanov

2
บันทึกวันของฉัน ฉันไม่มีการตัด <layout> ในไฟล์เลย์เอาต์ของฉัน ขอขอบคุณ!
Juliano

นอกจากนี้คุณยังสามารถเพิ่มว่า "import android.R" ต้องถูกลบออกหากเป็นส่วนหนึ่งของรายการนำเข้า สิ่งนี้ช่วยแก้ปัญหาของฉันด้วยการอ้างอิงที่ไม่ได้แก้ไขไปยังไฟล์ xml ของกิจกรรม
Tim John

23

คลาส DataBinding สร้างขึ้นโดยอัตโนมัติ

ถ้าชื่อ xml ของคุณคือ activity_test คลาส Binding จะเป็น ActivityTestBinding

แต่,

dataBinding {
        enabled = true
    }

เค้าโครงควรมีเค้าโครงเป็นรูท

<layout xmlns:android="http://schemas.android.com/apk/res/android">
</layout>

ฉันกำลังค้นหาจิตวิญญาณเป็นเวลาหลายชั่วโมงสร้างเวทย์มนตร์ให้มาก แต่ฉันใช้ConstraintLayoutเป็นรูท ขอขอบคุณ!
Alexey Markov

14

ฉันมีปัญหาเดียวกัน หลังจากอ่านเอกสาร sdk ของ android แล้วมีเพียงชื่อไฟล์ที่คาดว่าจะถูกสร้างขึ้น แต่ไม่มีอะไรจะทำถ้ามันไม่เกิดขึ้น ฉันสังเกตเห็นหลังจากการวิจัยเพิ่มเติมว่าหลังจากลบเนมสเปซไปยังองค์ประกอบเค้าโครงด้านล่าง (โดยใช้ตัวอย่างของคุณ) มันก็ใช้ได้สำหรับฉัน

    <?xml version="1.0" encoding="utf-8"?>
    <layout>
        <data>  </data>
        <RelativeLayout
           xmlns:android="http://schemas.android.com/apk/res/android"
           android:layout_width="match_parent"
           android:layout_height="match_parent">
        </RelativeLayout>
    </layout> 

10

ในกรณีของฉันคลาส Binding ถูกสร้างขึ้นและอยู่ในสถานที่ (แต่ฉันคิดว่ามันไม่ใช่) ... แต่มันไม่ได้เพิ่มการนำเข้าของคลาสดังกล่าวไปยังส่วนการนำเข้ากิจกรรม / แฟรกเมนต์โดยอัตโนมัติ ... ดังนั้น ... OPTION + เข้า :)


2
บิงโกทำงานให้ฉันแม้ว่าฉันจะต้องพิมพ์การนำเข้าด้วยตนเอง แต่ intellisense ไม่ได้เสนอตัวเลือกไม่ว่าด้วยเหตุผลใดก็ตาม
Rob

8

หลังจากตั้งค่าอย่างถูกต้อง (รวมถึงเนมสเปซ xml และการรวมทุกอย่างลงใน<layout>) สิ่งที่เหมาะกับฉันคือการสร้าง -> สร้างโครงการ ไม่ว่าจะทำโครงการ Clean หรือโครงการสร้างใหม่ ฉันใช้ Android Studio 2.3.1 โดยใช้ 26.0.2 build tools ไม่จำเป็นต้องมี<data>แท็ก


ควรทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้อง ส่วนที่เหลือทั้งหมดเป็นเพียงวิธีแก้ปัญหาเท่านั้น ไม่จำเป็นต้องย้ายเนมสเปซหรือเพิ่มองค์ประกอบข้อมูล
Vicky Kapadia

8

หากคุณทำงานพื้นฐานเพื่อเปิดใช้งานฐานข้อมูลในโครงการของคุณเช่นใช้เปิดใช้งานในการไล่ระดับสี และใช้แท็กเค้าโครงใน xmlเมื่อคุณเปลี่ยนโค้ด xml และไม่ได้สร้างคลาส databinding ใหม่สำหรับ xml เหล่านั้นคุณสามารถใช้วิธีที่รวดเร็วในการสร้างข้อมูลเท่านั้น คลาสที่มีผลผูกพันในgradle-> other-> databindinggenbaseclasses แก้ไขปัญหาได้เร็วกว่า bulid ทั้งโครงการ มันสร้างคลาส databinding เท่านั้น ป้อนคำอธิบายภาพที่นี่



3

คลาสการผูกข้อมูลจะถูกสร้างขึ้นในระหว่างการสร้างดังนั้นหลังจากที่คุณเปิดใช้งานการผูกข้อมูลในบิวด์ Gradle ของแอปและล้อม xml ของคุณด้วยแท็กเค้าโครงคุณควรสร้างแอปของคุณใหม่ หากไม่ได้ผลให้ลบโฟลเดอร์ build ของคุณแล้วทำอีกครั้ง


2

ฉันไม่รู้ว่ามันจะใช้ได้กับคุณหรือเปล่า เพียงแค่เปลี่ยนชื่อไฟล์ XML เค้าโครง เช่นสมมติว่าชื่อของคุณจะถูกจัดวางactivity_main.xmlเปลี่ยนแปลงเพียงแค่เปลี่ยนชื่อเป็นอะไรเช่นmain.xmlและอีกครั้งเปลี่ยนชื่อไปactivity_main.xml จากนั้นคุณสามารถสามารถที่จะเห็นตัวเลือกการนำเข้าในActivityMainBinding

หวังว่ามันจะเหมาะกับคุณ


2

ขอบคุณสำหรับคำตอบนี้ดูเหมือนว่า"เลย์เอาต์เนมสเปซ"จะต้องถูกล้างออกหรือคุณต้องการชื่อที่ไม่ซ้ำกันใหม่

นี่คือตัวเลือกที่เหมาะกับฉัน:

  1. สร้างชื่อใหม่สำหรับเค้าโครงเพื่อให้แน่ใจว่าสามารถสร้างได้ นี้แก้ปัญหาของฉันที่ฉันมีรูปแบบที่เป็นสร้างขึ้นครั้งแรกโดยไม่ต้องผูกข้อมูล - fragment_abc.xmlขอเรียกว่า เมื่อฉันพยายามเพิ่มการผูกข้อมูลมันไม่เป็นที่รู้จัก - แม้ว่าจะล้างแคชและเริ่มการโทรใหม่หลายครั้งก็ตาม อย่างไรก็ตามทันทีที่ฉันทำสำเนาของโครงร่างfragment_abc2.xmlฉันได้รับวัตถุ. java / .class ที่สร้างขึ้นในทันที

  2. หลังจากเห็นงานข้างต้นฉันพยายามลบโฟลเดอร์ / build ออกจากโมดูลและสร้างโปรเจ็กต์ใหม่ซึ่งได้ผลเพื่อรับการเชื่อมโยงข้อมูลสำหรับเลย์เอาต์ดั้งเดิม


1

สิ่งเดียวที่ฉันนึกได้ถ้าเป็นไปได้คือถ้าคุณไม่มี

dataBinding {
    enabled true
}

ในไฟล์ gradle ของคุณ หากไม่เพียงแค่เพิ่มลงในไฟล์ gradle กล่าวคือ

android {
  ......

  dataBinding {
    enabled true
  }
}

จากนั้นซิงค์โครงการของคุณ หากยังไม่สำเร็จคุณอาจต้องทำการ Invalidate / Restart of android studio ของคุณ


ฉันได้พูดถึงคำถามของฉันอย่างชัดเจนว่าหลังจากเพิ่ม<variable>ใน xml แล้วมันกำลังสร้างคลาส Binding ดังนั้นจึงไม่มีกรณีที่จะไม่เพิ่มdataBindingไฟล์ gradle ถ้าฉันไม่ได้เพิ่มเกินกว่าที่ควรจะไม่สร้างคลาสการผูก
ราวี

ก่อนที่จะซิงค์และรีสตาร์ท โปรดลอง "สร้าง" มันจะออกกำลังกาย
Nizamudeen Sherif

1

เมื่อคุณทำงานกับแอปพลิเคชัน Android หลายโมดูลให้ตรวจสอบพา ธ คลาสการผูกของคุณ บางทีคุณควรใช้:

import com.yourcompany.app.android.modulename.databinding.FragmentABCtBinding เกิดจาก:

import com.yourcompany.app.android.databinding.FragmentABCtBinding


1

ลบเค้าโครงและเลิกทำและตรวจสอบให้แน่ใจว่าได้นำเข้าคลาสการผูกที่สร้างขึ้นอย่างถูกต้องหลังจากนั้น


1

วิธีแก้ปัญหาของฉันคือใช้เป็นส่วนต่อท้าย FragmentBinding ในชื่อคลาส

คลาสที่มีผลผูกพันถูกสร้างขึ้นสำหรับไฟล์โครงร่างแต่ละไฟล์ โดยดีฟอลต์ชื่อของคลาสจะขึ้นอยู่กับชื่อของไฟล์เลย์เอาต์โดยแปลงเป็นตัวอักษร Pascal และเพิ่มส่วนต่อท้าย Binding เข้าไป ชื่อไฟล์โครงร่างด้านบนคือ activity_main.xml ดังนั้นคลาสที่สร้างขึ้นที่สอดคล้องกันคือ ActivityMainBinding คลาสนี้เก็บการโยงทั้งหมดจากคุณสมบัติโครงร่าง (ตัวอย่างเช่นตัวแปรผู้ใช้) ไปยังมุมมองของโครงร่างและรู้วิธีกำหนดค่าสำหรับนิพจน์การผูก

ระบบการตั้งชื่อของชื่อของกิจกรรมหรือคลาสแฟรกเมนต์อาจแตกต่างกันไปในแง่ของคำนำหน้า เพราะคำต่อท้ายมีผลผูกพันเสมอ

หลังจากทำตามการตอบสนองของKhemrajและโมฆะแคช / รีสตาร์ท , คุณควรเขียน ActivityBinding หรือ FragmentBindingที่จะได้รับข้อเสนอแนะ IDE ของการเรียนที่ถูกสร้างแล้วและไม่ hardcode นำเข้า

ในกรณีของผมผมพยายามที่จะนำเข้าชื่อของชั้นหลังเป็นแทนFragmentCompetitionsBindingCompetitionsFragmentBinding

GL

ที่มา


1

หากคำตอบไม่ได้ผลสำหรับคุณคำแนะนำของฉันนั้นเรียบง่าย แต่ได้ผล

แนวคิดคือการพิจารณาว่าองค์ประกอบใดที่ก่อให้เกิดปัญหา การทำเช่นนี้แสดงความคิดเห็นในทุกสายของคุณcustom_fragment.xmlและใช้มันในCustomFragment.ktและออกจากสิ่งที่เรียบง่ายเช่นต่อไปนี้

<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:id="@+id/test"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</layout>

จากนั้นเรียกใช้แอพและเพิ่มส่วนประกอบลงในคอมโพเนนต์ในขณะที่คุณApply Code Changes(Ctrl + Alt + F10) เพื่อดำเนินการแอพจนกว่าแอพจะหยุดทำงานนั่นคือเมื่อคุณพบข้อบกพร่อง

บันทึกการผูกข้อมูลบางครั้งไม่สามารถอธิบายได้และนี่เป็นกลยุทธ์ทั่วไปในการค้นหาส่วนประกอบที่ผิดพลาด

GL


0

ฉันมีปัญหาเดียวกัน ทุกสิ่งที่คุณทำถูกต้อง สิ่งนี้คือคุณต้องเพิ่มตัวแปรภายในแท็กข้อมูลใน xml ด้วยเหตุนี้คุณควรสร้างคลาสโมเดลตัวอย่างและเพิ่มเป็นตัวแปรในแท็กข้อมูล

จนกว่าคุณจะไม่เห็น ActivityMainBinding ที่สร้างขึ้น


0

ฉันมีปัญหาคล้ายกันที่ฉันมีการจัดวางและการผูกข้อมูลของฉันเปิดใช้งานในไฟล์ gradle กิจกรรมหลักยังไม่สามารถ intellisense หรือดูคลาสของฉันได้ สิ่งที่แก้ไขสำหรับฉันคือการเพิ่มตัวแปรการผูกและนำเข้าการเชื่อมต่อ จากนั้นฉันก็สร้างโซลูชันจากนั้นดูเหมือนจะรู้ว่าคลาสคืออะไร จากนั้นฉันสามารถนำเข้าคลาสเคสอูฐของฉันที่สร้างขึ้น


0

ฉันได้รับปัญหาและปัญหาอยู่ในเลย์เอาต์ฟิลด์ที่ใช้ไม่ใช่สตริงมันเป็นวันที่

ดูเหมือนว่าฟิลด์ทั้งหมดจะต้องเป็นข้อความที่ใช้งานได้อย่างน้อยก็มีส่วนประกอบของ TexView

หากคุณสร้างด้วยคำสั่ง. /gradlew build --stacktrace

แสดงข้อผิดพลาดได้ดีกว่า


0

ในกรณีของฉันฉันคิดว่าคลาสที่สร้างขึ้นจะต้องปรากฏพร้อมกับคลาสปกติของฉันในsrcโฟลเดอร์ นอกจากนี้ฉันคิดว่าชื่อของคลาสที่สร้างขึ้นควรแตกต่างกันเล็กน้อย ทั้งหมดเป็นความผิดพลาดของฉัน คลาสที่สร้างขึ้นสามารถพบได้ในbuildโฟลเดอร์build -> generated -> ...เส้นทาง หากไม่มีการนำเข้าคลาสที่สร้างขึ้นในกิจกรรมของคุณให้เพิ่มการนำเข้า

import com.yourcompany.app.databinding.ActivityMainBinding;"

0

ในกรณีที่คุณได้รับข้อผิดพลาดต่อไปนี้ใน DataBindingUtil.setContentView

การอ้างอิงที่ไม่ได้รับการแก้ไข: activity_main

สิ่งที่คุณต้องทำคือลบคำสั่งนำเข้าต่อไปนี้

นำเข้า android.R

ฉันพบวิธีแก้ปัญหาในฟอรัมอื่น ที่มา


0

หากเมื่อเร็ว ๆ นี้มีใครย้ายโครงการที่มีอยู่ไปยังandroidxคุณจะต้องแทนที่การนำเข้าของคุณจาก

import com.yourpackagename.BR;

ถึง

import androidx.databinding.library.baseAdapters.BR;

หลังจาก Google 2 วันในที่สุดก็ได้วิธีแก้ปัญหาอันไหนเหมาะกับฉัน


1
ไม่ได้ Binding Resource ( .BR. ) เช่น Resource ( .R. ) สร้างขึ้นตามทรัพยากรโครงการของคุณ (id, drawable, color, ... ) ดังนั้นจะวางไว้ในแพ็คเกจโครงการของคุณ ( your.project.package.BR) androidx.databinding.library.baseAdapters.BRไม่ได้อยู่ในห้องสมุดบุคคลที่สามเช่น
dphans

0

มีหลายกรณีที่คุณไม่เห็นไฟล์ภายใต้ไดเร็กทอรีที่สร้างขึ้นคุณอาจผูกคุณสมบัติที่ไม่ได้ประกาศใน viewmodel มันไม่ได้ทำให้คุณมีข้อผิดพลาดเป็นหลักหากคุณทำใน xml


0

หากคุณใช้Serializable -> คุณต้องใช้Serializable

มิฉะนั้นคุณจะได้รับข้อผิดพลาดนี้ หวังว่ามันจะช่วยใครบางคนในอนาคต

ในกรณีของฉันฉันใช้ห้องสมุดพัสดุ ฉันพลาดที่จะใส่คำอธิบายประกอบ @Parcel ในคลาสย่อยของฉัน


0

นอกเหนือจากขั้นตอนข้างต้นแล้วคุณยังตรวจสอบประเภทตัวแปรได้อีกด้วย ตรวจสอบให้แน่ใจว่าเป็น String สำหรับ TextView หรือเหมือนกับที่กำหนดไว้ในไฟล์BindingAdapter. ตัวอย่างเช่น:

data class MyDataObject(val name: String, val age: Int)

และใน XML:

android:text="@{dataobject.age}"

ซึ่งจะทำให้เกิดข้อผิดพลาดข้างต้น ในการแก้ไขคุณสามารถสร้างตัวแปรอายุเป็นประเภท String หรือนำเข้า String ใน XML ของคุณและใช้String.valueOf(age)ดังต่อไปนี้:

<data>
    <import type="String" />
...
</data>

และใน TextView ของคุณ:

android:text="@{String.valueOf(dataobject.age)}"

0

ในกรณีของฉันคลาสการผูกข้อมูลไม่ได้ถูกสร้างขึ้นเนื่องจากฉันได้ลบ mipmap Android Resource Directory ฉันสร้างไดเร็กทอรี res / mipmap / ใหม่และคลาสการผูกข้อมูลถูกคืนสถานะ


0

ฉันพบปัญหาคล้ายกันที่ DataBinding ไม่สามารถสร้างคลาสBindingImpl ในกรณีของฉันเป็นปัญหาจากวิธีในชั้นเรียนข้อมูลที่เป็นชื่อที่ใช้ผิดรูปแบบที่มีวิธีการonSignInCliked ()และในรูปแบบที่ผมใช้onSigninCliked () สังเกตการลงชื่อเข้าใช้เทียบกับการลงชื่อเข้าใช้

ข้อความแสดงข้อผิดพลาดไม่เพียงพอและฉันพบปัญหาก็ต่อเมื่อฉันใช้บิลด์สคริปต์กับตัวเลือก stack-trace


0

ตรวจสอบให้แน่ใจว่าเปิดใช้งานการผูกข้อมูลแล้ว

android {
...
   dataBinding {
        enabled = true
    }
...
}

ซิงค์โปรเจ็กต์กับ gradle คลิกปุ่ม (ซิงค์โปรเจ็กต์กับ Gradle)


0

หากมีปัญหากับไฟล์ XML ของคุณคลาส Databinding จะไม่ถูกสร้างขึ้น การแก้ไขอย่างรวดเร็วคือการเรียกใช้ไฟล์ XML และตรวจสอบข้อผิดพลาดทางไวยากรณ์ (ซึ่งมักจะเน้นด้วยสีแดง) ข้อผิดพลาดอาจมาในรูปแบบของการอ้างอิงที่ไม่มีอยู่หรือไม่ถูกต้องข้อผิดพลาดในการพิมพ์ ฯลฯ

โดยพื้นฐานแล้วเพียงตรวจสอบให้แน่ใจว่าไม่มีบรรทัดที่ขีดเส้นใต้สีแดงในโค้ด XML ของคุณ เมื่อคุณทำเสร็จแล้วให้สร้างใหม่และคลาส Databinding ของคุณจะถูกสร้างขึ้น


-1

1. เพิ่มด้านล่างในแอป gradle

 dataBinding {
        enabled = true
    }

2. ในรูปแบบ xml เขียนโค้ดด้านล่าง

<layout
    xmlns:android="http://schemas.android.com/apk/res/android">
  <data></data>
</layout>if you don't get data binding class just rename the layout file name and you will get data binding class.

3
เหตุใด dataBinding จึงต้องได้รับอนุญาตจากอินเทอร์เน็ตในกรณีทั่วไป
ปอมออย

1
@ M.Pomeroy ใช่ไม่จำเป็นไม่แก้ไขคำตอบขอบคุณ
Rohan Lodhi

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.