ใช้การผูกข้อมูลเพื่อตั้งค่าการมองเห็น


97

พยายามที่จะมองเห็นชุดของViewใช้ตัวแปรที่กำหนดเอง Identifiers must have user defined types from the XML file. visible is missing itแต่ข้อผิดพลาดเกิดขึ้น: เป็นไปได้ไหมที่จะตั้งค่าการมองเห็นโดยใช้การผูกข้อมูล ขอบคุณ.

<data>
    <variable
        name="sale"
        type="java.lang.Boolean"/>
</data>

<FrameLayout android:visibility="@{sale ? visible : gone}"/>

คำตอบ:


218

ตามที่ระบุไว้ในคู่มือนักพัฒนา Androidคุณต้องดำเนินการดังนี้:

<data>
    <import type="android.view.View"/>
    <variable
        name="sale"
        type="java.lang.Boolean"/>
</data>

<FrameLayout android:visibility="@{sale ? View.GONE : View.VISIBLE}"/>

5
และจะกำหนดมูลค่าเป็น "การขาย" ได้อย่างไร?
RobinHood

คุณหมายถึงวิธีกำหนดค่า "sale" ให้กับตัวแปร String หรือไม่?
David Artmann

เป๊ะ! ฉันกำลังประสบปัญหา โปรดแบ่งปันฉันจะเปรียบเทียบแล้วแจ้งให้คุณทราบ
RobinHood

39
ไอ้เหี้ย! ฉันพลาดการนำเข้า Silly ได้อย่างไร เสร็จแล้วขอบคุณ
RobinHood

เฮ้! มีความคิดว่าทำไมตำแหน่งผิดพลาดในการเลื่อน? Adapter
RobinHood

56

ในเค้าโครงของคุณ:

<data>
    <variable
        name="viewModel"
        type="...."/>
</data>


<View
 android:layout_width="10dp"
 android:layout_height="10dp"
 android:visibility="@{viewModel.saleVisibility, default=gone}"/>

ในโค้ดจาวา ViewModel ของคุณ:

@Bindable
public int getSaleVisibility(){
 return mSaleIndecator ? VISIBLE : GONE;
}

3
คุณช่วยฉันจากอาการปวดหัวเล็กน้อย
Koen Van Looveren

2
แบบจำลองข้อมูลของคุณต้องสามารถสังเกตได้เพื่อให้ทำงานได้
yshahak

นี้ทำงานให้ฉันโดยไม่@Bindableรวมถึง BaseObservableเมื่อผมรวมที่ผมได้รับข้อผิดพลาดที่มีผลผูกพันที่แตกต่างกันรวมทั้งข้อเสนอแนะที่จะขยาย ตัวชี้ที่ดีที่นี่
Gene Bo

2
ต้องเป็นคำตอบที่ยอมรับ! มันใช้งานได้ดีสำหรับฉัน!
วิกฤต

ข้อเสนอแนะสำหรับLiveData<Boolean>?
Sourav Bagchi

41

ปัญหาคือvisibilityอยู่IntegerในViewชั้นเรียนซึ่งหมายความว่าคุณมีสองวิธีในการทำงานนี้:

  1. ใช้ค่าคงที่View.VISIBLEและ https://developer.android.com/topic/libraries/data-binding/index.html#importsView.GONE
  2. กำหนด setter ที่กำหนดเองสำหรับvisibilityสิ่งBooleanนั้น https://developer.android.com/topic/libraries/data-binding/index.html#custom_setters

การใช้งานที่เป็นไปได้:

@BindingAdapter("android:visibility")
public static void setVisibility(View view, Boolean value) {
    view.setVisibility(value ? View.VISIBLE : View.GONE);
}

ซึ่งจะทำให้การ<FrameLayout android:visibility="@{sale}"/>ทำงาน


4
ในกรณีที่คุณสะดวกตัวประมวลผลคำอธิบายประกอบจะตรวจจับโดยอัตโนมัติในระหว่างการคอมไพล์
Kiskae

ขอบคุณฉันใส่ไว้ใน BindingUtils.java
nhoxbypass

แต่จะกำหนดมูลค่าการขายอย่างไร?
EslamWael74

1
ฉันจะใช้แนวทางเดียวกันกับ <รวมแท็กได้อย่างไร
Zafer Celaloglu

1
@ EslamWael74 คุณกำหนดมูลค่าการขายผ่านการผูกในโค้ด Java / Kotlin ของคุณ บางอย่างเช่น val binding = MyClassBinding.inflate (... ) จากนั้นคุณสามารถเรียก binding.sale = true
Matt Robertson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.