วิธีขยายมุมมองหนึ่งด้วยเค้าโครง


221

ฉันมีเลย์เอาต์ที่กำหนดไว้ใน XML มันมียัง:

<RelativeLayout
    android:id="@+id/item"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
/>

ฉันต้องการขยาย RelativeView นี้ด้วยไฟล์เลย์เอาต์ XML อื่น ๆ ฉันอาจใช้เค้าโครงที่แตกต่างกันขึ้นอยู่กับสถานการณ์ ฉันควรทำอย่างไร ฉันลองใช้รูปแบบที่แตกต่างกันของ

RelativeLayout item = (RelativeLayout) findViewById(R.id.item);
item.inflate(...)

แต่ไม่มีใครทำงานได้ดี

คำตอบ:


390

ฉันไม่แน่ใจว่าฉันได้ทำตามคำถามของคุณแล้ว - คุณพยายามแนบมุมมองเด็กกับ RelativeLayout หรือไม่? ถ้าเป็นเช่นนั้นคุณต้องการทำบางสิ่งตามแนวของ:

RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
item.addView(child);

3
ฉันได้รับข้อผิดพลาด: 02-25 22: 21: 19.324: ข้อผิดพลาด / AndroidRuntime (865): เกิดจาก: java.lang.IllegalStateException: เด็กที่ระบุมีพ่อแม่แล้ว คุณต้องโทร removeView () ที่ผู้ปกครองของเด็กก่อน
Michal Dymel

27
เพียงลองตอนนี้ฉันต้องการ: ดู child = getLayoutInflater (). ขยาย (R.layout.child, null);
James

3
ปัญหาไม่ใช่รหัส มันค่อนข้างง่ายที่จะติดตามรหัส คุณสร้างไฟล์ xml ที่ไหน ประเภทคือทรัพยากรสไตล์ของธีมหรือไม่ ปัญหาที่ฉันคิดว่าคนที่ฉันรวมไว้คือเราวางไฟล์ xml นี้ไว้
ที่ไหน

15
มันไม่สมบูรณ์แบบ ควรใช้เครื่องสูบลม
Nick Cardoso

3
คำตอบนั้นไม่ถูกต้องแม้ว่าจะใช้งานได้ กรุณาตรวจสอบโพสต์นี้ possiblemobile.com/2013/05/layout-inflation-as-intended
ARK

107

คุณขยายทรัพยากร XML ดูdoc LayoutInflater

หากเลย์เอาต์ของคุณอยู่ในmylayout.xmlคุณจะต้องทำสิ่งต่อไปนี้:

View view; 
LayoutInflater inflater = (LayoutInflater)   getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
view = inflater.inflate(R.layout.mylayout, null);

RelativeLayout item = (RelativeLayout) view.findViewById(R.id.item);

4
ฉันมีมุมมองหลักที่สูงเกินจริง ปัญหาคือฉันต้องการขยายส่วนหนึ่งของมันจากไฟล์ XML อื่น ๆ รายการนี้ RelativeLayout เป็นส่วนหนึ่งของเลย์เอาต์ที่ใหญ่กว่าและฉันต้องการเติมด้วยเลย์เอาต์จากไฟล์ XML อื่น
Michal Dymel

. ครวญเพลงฉันขอโทษแล้วฉันมีเงื่อนงำ :( คุณใช้อะไรเช่น < ได้แก่ > ในมุมมองหลักของคุณจะรวมถึงรูปแบบอื่น ๆ
ccheneson

ไม่มันเป็นเค้าโครงที่เรียบง่าย ฉันคิดว่าฉันจะเพิ่มองค์ประกอบของฉันแบบเป็นโปรแกรมโดยไม่มี XML ขอบคุณที่ช่วยเหลือ!
Michal Dymel

27

แม้ว่าคำตอบจะล่าช้า แต่ต้องการเพิ่มวิธีหนึ่งในการรับสิ่งนี้

LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = layoutInflater.inflate(R.layout.mylayout, item );

โดยที่itemเป็นโครงร่างพาเรนต์ที่คุณต้องการเพิ่มโครงร่างย่อย


(แม้ในภายหลัง) ฉันมีปัญหาในการใช้คำตอบของคุณ ฉันลองใช้รหัสที่คุณกล่าวถึงข้างต้น แต่แทนที่ 'รายการ' ด้วย: 'R.layout.activity_layout' ฉันได้รับข้อความว่า "ไม่มีวิธีการที่ใช้บังคับกับ '(int, int)'" ฉันจะรบกวนความคิดของคุณหรือไม่?
Kyle

1
@Kyle - ยังภายหลัง คุณลาดเทใช้Rทรัพยากรการอ้างอิงไปยังวัตถุที่พวกเขาเป็นเพียงints คุณต้องใช้การfindViewByIdส่งผ่านRทรัพยากรจากนั้นพิมพ์ cast ไปยังวัตถุที่คุณต้องการ inflateจากนั้นคุณสามารถใช้มันในการเรียกฟังก์ชั่นเช่น (. คือViewGroup item = (ViewGroup) findViewById(R.layout.activity_layout);... แล้วคุณสามารถใช้itemเหมือนข้างบน.)
แมงดา Trizkit

ฉันเดาว่าฉันจะใช้RelativeLayoutแทนที่จะเป็นViewGroupตัวอย่างในตัวอย่างข้างต้นเพราะคุณไม่สามารถยกระดับคลาสพื้นฐานViewGroupได้ กฎการแก้ไข 5 นาทีทำให้ฉันได้ lol
Pimp Trizkit

เป็นไปได้หรือไม่ที่จะซ่อนพาเรนต์และแสดงเฉพาะมุมมองลูก
NovusMobile

ขอบคุณวิธีนี้ช่วยฉันไม่สามารถใช้ getContext () ในตัวอย่างก่อนหน้านี้เนื่องจากฉันใช้แฟรกเมนต์
RightHandedMonkey

19

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

View child = getLayoutInflater().inflate(R.layout.child, item, false);

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


สุดท้ายนี้ขอขอบคุณ :) สิ่งนี้ช่วยให้สามารถเพิ่มมุมมองหลายมุมในพาเรนต์เดียว แต่ไม่ต้องกังวลเกี่ยวกับ LayoutParams - ซึ่งอ่านจาก XML เยี่ยมมาก!
Sabo

13

วิธีที่ง่ายกว่าคือการใช้

View child = View.inflate(context, R.layout.child, null)
item.addChild(child) //attach to your item

ใช้View.inflate()เป็นวิธีที่ดีที่สุดที่ไม่มีที่ไม่จำเป็นLayoutInflaterหรือgetSystemService(Context.LAYOUT_INFLATER_SERVICE)หรือใด ๆ ของทุกรำคาญที่! : D
varun


6

หากคุณไม่ได้อยู่ในกิจกรรมคุณสามารถใช้from()วิธีการคงที่จากLayoutInflaterชั้นเรียนเพื่อรับLayoutInflaterหรือขอบริการจากวิธีบริบทgetSystemService()ด้วย:

LayoutInflater i;
Context x;       //Assuming here that x is a valid context, not null

i = (LayoutInflater) x.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//OR
i = LayoutInflater.from(x);

(ฉันรู้ว่ามันเกือบ 4 ปีที่แล้ว แต่ก็ยังมีมูลค่าการกล่าวขวัญ)


4

หากคุณต้องการเพิ่มมุมมองเดียวหลายครั้งคุณต้องใช้

   layoutInflaterForButton = getActivity().getLayoutInflater();

 for (int noOfButton = 0; noOfButton < 5; noOfButton++) {
        FrameLayout btnView = (FrameLayout) layoutInflaterForButton.inflate(R.layout.poll_button, null);
        btnContainer.addView(btnView);
    }

ถ้าคุณชอบ

   layoutInflaterForButton = getActivity().getLayoutInflater();
    FrameLayout btnView = (FrameLayout) layoutInflaterForButton.inflate(R.layout.poll_button, null);

และ

for (int noOfButton = 0; noOfButton < 5; noOfButton++) {
            btnContainer.addView(btnView);
        }

จากนั้นจะมีการยกเว้นข้อยกเว้นของมุมมองที่เพิ่มทั้งหมด


4

AttachToRoot ตั้งค่าเป็น True

แค่คิดว่าเราระบุปุ่มในไฟล์เลย์เอาต์ XML ที่มีความกว้างของเลย์เอาต์และความสูงของเลย์เอาต์ที่กำหนดเป็น match_parent

<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/custom_button">
</Button>

ที่ปุ่มนี้คลิกเหตุการณ์เราสามารถตั้งรหัสต่อไปนี้เพื่อขยายเค้าโครงในกิจกรรมนี้

LayoutInflater inflater = LayoutInflater.from(getContext());
inflater.inflate(R.layout.yourlayoutname, this);

หวังว่าวิธีนี้จะเหมาะกับคุณ!


3

ลองรหัสนี้:

  1. หากคุณต้องการขยายเค้าโครงของคุณ:

View view = LayoutInflater.from(context).inflate(R.layout.your_xml_layout,null); // Code for inflating xml layout
RelativeLayout item = view.findViewById(R.id.item);   

  1. หากคุณต้องการขยายเลย์เอาต์ของคุณในคอนเทนเนอร์ (เลย์เอาต์หลัก):

LinearLayout parent = findViewById(R.id.container);        //parent layout.
View view = LayoutInflater.from(context).inflate(R.layout.your_xml_layout,parent,false); 
RelativeLayout item = view.findViewById(R.id.item);       //initialize layout & By this you can also perform any event.
parent.addView(view);             //adding your inflated layout in parent layout.


2

ฉันมีเวลาที่ยากที่สุดกับข้อผิดพลาดนี้เนื่องจากสถานการณ์ที่ไม่ซ้ำกันของฉัน แต่ในที่สุดก็พบทางออก

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

// set up Alert Dialog box
AlertDialog.Builder alert = new AlertDialog.Builder(this);
// inflate other xml where WebView is
LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService
                (Context.LAYOUT_INFLATER_SERVICE);
View v = layoutInflater.inflate(R.layout.your_webview_layout, null);
final WebView webView = (WebView) v.findViewById(R.id.your_webview_id);

// more code...

.... ต่อมาหลังจากที่ฉันโหลดWebView....

// first, remove the parent of WebView from it's old parent so can be assigned a new one.
ViewGroup vg = (ViewGroup) webView.getParent();
vg.removeAllViews();

// put WebView in Dialog box
alert.setView(webView);
alert.show();

2

หากคุณกำลังพยายามแนบมุมมองเด็กกับ RelativeLayout คุณสามารถทำได้โดยทำตาม

RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, item, true);

1

ด้วย Kotlin คุณสามารถใช้:

val content = LayoutInflater.from(context).inflate(R.layout.[custom_layout_name], null)

[your_main_layout].apply {
    //..
    addView(content)
}

-1

ฉันใช้โค้ดด้านล่างนี้และมันใช้ได้กับฉัน

LinearLayout linearLayout = (LinearLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
linearLayout.addView(child);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.