แท็ก "รวม" เค้าโครง XML ของ Android ใช้งานได้จริงหรือไม่


84

ฉันไม่สามารถแทนที่แอตทริบิวต์เมื่อใช้ <include> ในไฟล์เลย์เอาต์ Android ของฉัน เมื่อฉันค้นหาจุดบกพร่องฉันพบปัญหาที่ถูกปฏิเสธ2863 :

"รวมแท็กเสีย (การลบพารามิเตอร์การจัดวางไม่ทำงาน)"

เนื่องจาก Romain ระบุว่าสิ่งนี้ใช้ได้ผลในห้องทดสอบและตัวอย่างของเขาฉันต้องทำอะไรผิดพลาด

โครงการของฉันมีการจัดระเบียบดังนี้:

res/layout
  buttons.xml

res/layout-land
  receipt.xml

res/layout-port
  receipt.xml

button.xml มีดังนี้:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

  <Button .../>

  <Button .../>
</LinearLayout>

และไฟล์ใบเสร็จ. xml แนวตั้งและแนวนอนมีลักษณะดังนี้:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">

  ...

  <!-- Overridden attributes never work. Nor do attributes like
       the red background, which is specified here. -->
  <include
      android:id="@+id/buttons_override"
      android:background="#ff0000"
      android:layout_width="fill_parent"
      layout="@layout/buttons"/>

</LinearLayout>

ฉันขาดอะไรไป?


คำถามนี้อ้างถึงโดยเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ Android เมื่อคุณพยายามใช้รวมในลักษณะที่ไม่รองรับ
ThomasW

คำตอบ:


132

ฉันเพิ่งพบปัญหา ขั้นแรกคุณสามารถแทนที่แอตทริบิวต์ layout_ * เท่านั้นดังนั้นพื้นหลังจะไม่ทำงาน นั่นคือพฤติกรรมที่บันทึกไว้และเป็นเพียงการกำกับดูแลในส่วนของฉัน

พบปัญหาที่แท้จริงใน LayoutInflater.java:

// We try to load the layout params set in the <include /> tag. If
// they don't exist, we will rely on the layout params set in the
// included XML file.
// During a layoutparams generation, a runtime exception is thrown
// if either layout_width or layout_height is missing. We catch
// this exception and set localParams accordingly: true means we
// successfully loaded layout params from the <include /> tag,
// false means we need to rely on the included layout params.
ViewGroup.LayoutParams params = null;
try {
   params = group.generateLayoutParams(attrs);
} catch (RuntimeException e) {
   params = group.generateLayoutParams(childAttrs);
} finally {
   if (params != null) {
     view.setLayoutParams(params);
   }
}

หากแท็ก <include> ไม่มีทั้ง layout_width และ layout_height RuntimeException จะเกิดขึ้นและได้รับการจัดการแบบไม่โต้ตอบโดยไม่มีคำสั่งบันทึกใด ๆ แม้แต่น้อย

วิธีแก้ปัญหาคือต้องรวมทั้ง layout_width และ layout_height เสมอเมื่อใช้แท็ก <include> หากคุณต้องการแทนที่แอตทริบิวต์ layout_ * ใด ๆ

ตัวอย่างของฉันควรเปลี่ยนเป็น:

<include
      android:id="@+id/buttons_override"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      layout="@layout/buttons"/>

33
นี่มันไร้สาระ ฉันไม่สามารถทำให้สิ่งนี้ใช้งานได้และฉันยังเห็นเอกสารที่กล่าวถึงว่าต้องการทั้งความสูงและความกว้างหากพยายามแทนที่ขนาดซึ่งฉันคิดว่าเป็นความสูงและความกว้าง อย่างไรก็ตามสิ่งที่ฉันพยายามจะลบล้างคือระยะขอบซึ่งไม่ใช่มิติข้อมูลจริงๆ เหตุใดฉันจึงต้องระบุทั้งสองอย่างหรือแม้กระทั่งใด ๆ ในเมื่อทั้งหมดที่ฉันต้องการเปลี่ยนคือ layout_marginRight Grrr Android บางครั้งคุณก็ทำให้ฉันหงุดหงิดมากเกินไป
Artem Russakovskii

1
FYI Android Lint จะให้ข้อผิดพลาด (พารามิเตอร์ Layout layout_height ถูกละเว้นเว้นแต่ว่า layout_width จะระบุไว้ในแท็ก <include> ด้วย) หากคุณไม่ได้ลบล้างแอตทริบิวต์ความสูงและความกว้าง
ไบนารี

10

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

สมมติว่าฉันมีเค้าโครงที่เหมือนกันสองแบบนอกเหนือจากค่าของ TextViewเขตข้อมูล ปัจจุบันฉันได้แก้ไขโครงร่างที่รันไทม์หรือทำซ้ำ XML

ตัวอย่างเช่นการส่งสองพารามิเตอร์ที่มีค่า "hello" และ "world" ไปยัง layout1:

<include layout="@layout/layout1a" params="textView=hello|editText=world" />

layout1a.xml:

<merge><TextView text="@param/textView"><EditText hint="@param/editText"></merge>

การใช้งานทางเลือกจะทำลายการห่อหุ้มและอนุญาตให้คำสั่ง include แทนที่ค่าต่างๆเช่น:

<include layout="@layout/layout1b" overrides="@id/textView.text=hello|@id/editText.hint=world" />

layout1b.xml:

<merge><TextView id="@+id/textView"><EditText hint="@+id/editText"></merge>


1
เมื่อพิจารณาถึงสิ่งที่เชื่อมต่อกับฐานข้อมูลใหม่สิ่ง<include>นี้ถูกใช้บ่อยขึ้นในขณะนี้การลบล้างการ
ยึดติดเป็น

1

ฉันพบว่าบางครั้งฉันพลาดแท็ก android: id เมื่อใช้ตัวสร้าง GUI ใน Eclipse ตรวจสอบให้แน่ใจว่า (เมื่อฉันสังเกตเห็น) ว่าฉันเพิ่มลงใน TextView จากตัวสร้างรหัสที่ฉันใช้ในเลย์เอาต์ ListView

<TextView android:text="@+id/textView1"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" />
...

กลายเป็น

<TextView android:id="@+id/textView1"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" />
...

แทนที่จะได้รับ 'เท็จ' 'เท็จ' ฉันได้รับ :) และรวมถึงการทำงานที่โอเค

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