2011-10-27 41 views
24

OK, Vì vậy, tôi hiểu cách sử dụng thẻ bao gồm nhưng tôi đã gặp sự cố.Android sử dụng bố cục làm mẫu để tạo nhiều bản sao bố cục

Về cơ bản, tôi muốn bố cục được xác định bằng xml có một vài số là TextViewImageView trong đó. Sau đó tôi muốn lặp qua một mảng và điền vào các trường trong bố trí xml tùy thuộc vào những gì trong một mảng (được điền vào thời gian chạy). Do đó tạo nhiều bản sao của bố cục xml và điền vào các trường có dữ liệu duy nhất. Bây giờ tôi đã không có ý tưởng làm thế nào bạn có thể tái sử dụng này LinearLayout theo cách này là TextView s và ImageView s trong đó có một id liên tục và tôi cần phải thực hiện nhiều bản sao của bố trí này.

Có cách nào để thổi phồng một nguồn tài nguyên và sau đó tạo ra một bản sao của nó, mà sẽ làm việc ... Vì vậy

LinearLayout one = new LinearLayout(inflater.inflate(R.layout.home, container, false)); 

^Không có constructor như thế không may.

Cách duy nhất khác là thực hiện tất cả theo chương trình nhưng tôi muốn có các thuộc tính của chế độ xem và LinearLayout trong xml thay vì trong mã. Nó giống như tôi muốn các LinearLayout là một mẫu mà bạn có thể làm cho bản sao của tôi đoán ... Thực sự không chắc chắn nếu đó là có thể.

Trả lời

42

Bạn có thể dễ dàng thực hiện việc này, bạn chỉ cần phá vỡ nó. Trước tiên, bạn tải bố cục mà bạn muốn chèn các chế độ xem động của mình vào. Sau đó, bạn thổi phồng subview của bạn và cư nó nhiều lần như bạn cần. Sau đó, bạn thêm chế độ xem vào bố cục gốc và cuối cùng đặt chế độ xem nội dung của hoạt động thành chế độ xem gốc.

Dưới đây là một ví dụ:

LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    LinearLayout parent = (LinearLayout) inflater.inflate(R.layout.main, 
      null); 

    for (int i = 0; i < 3; i++) { 
     View custom = inflater.inflate(R.layout.custom, null); 
     TextView tv = (TextView) custom.findViewById(R.id.text); 
     tv.setText("Custom View " + i); 
     parent.addView(custom); 
    } 

    setContentView(parent); 

đây là file main.xml mà tôi đang chèn vào:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

</LinearLayout> 

và đây là quan điểm custom.xml mà tôi thổi phồng, cư và động chèn:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" > 

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

     <ImageView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:src="@drawable/ic_launcher" /> 

     <TextView 
      android:id="@+id/text" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" /> 
    </LinearLayout> 

</LinearLayout> 

Hy vọng ví dụ này sẽ hữu ích!

+0

Cảm ơn rất nhiều! Đó là sắp xếp nó ... Tôi nghĩ rằng tôi cần phải có được đầu của tôi xung quanh các cuộc gọi thổi phồng khác nhau (....). – gunboatmedia

+1

Cảm ơn! Ví dụ tốt về inflater quá! –

+1

Có cách nào chỉ cần sao chép bố cục trong vòng lặp thay vì sử dụng inflator.inflate() mỗi lần lặp? Dường như với tôi rằng lạm phát là rất tốn kém so với chỉ đơn giản là sao chép. –

7

Để annyone vẫn đang tìm kiếm một giải pháp tương tự, rõ ràng bạn cũng có thể sử dụng include trực tiếp trong xml và vẫn có thể tham khảo chúng trong mã:

LinearLayout row1 = (LinearLayout) findViewById(R.id.row1) 
TextView text1 = row1.findViewById(R.id.text); 

LinearLayout row2 = (LinearLayout) findViewById(R.id.row2) 
TextView text2 = row2.findViewById(R.id.text); 

Nguồn: Romain Guy

Các vấn đề liên quan