Làm thế nào để tăng một chế độ xem với bố cục


221

Tôi có một bố cục được định nghĩa trong XML. Nó cũng chứa:

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

Tôi muốn thổi phồng RelativeView này với tệp bố cục XML khác. Tôi có thể sử dụng các bố cục khác nhau tùy thuộc vào một tình huống. Tôi nên làm thế nào? Tôi đã thử các biến thể khác nhau của

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

Nhưng không ai trong số họ làm việc tốt.

Câu trả lời:


390

Tôi không chắc chắn tôi đã làm theo câu hỏi của bạn - bạn có đang cố gắn một chế độ xem trẻ em vào RelativeLayout không? Nếu vậy bạn muốn làm một cái gì đó dọc theo dòng:

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

3
Tôi gặp lỗi: 02-25 22: 21: 19.324: ERROR / AndroidR.78 (865): Nguyên nhân bởi: java.lang.IllegalStateException: Đứa trẻ được chỉ định đã có cha mẹ. Trước tiên, bạn phải gọi removeView () trên cha mẹ của đứa trẻ.
Michal Dymel

27
Chỉ cần thử điều này ngay bây giờ, tôi cần: Xem con = getLayoutInflater (). Inflate (R.layout.child, null);
James

3
Vấn đề không phải là mã. Nó khá dễ dàng để làm theo mã. Nơi nào bạn thực hiện các tập tin xml. là loại tài nguyên phong cách chủ đề? vấn đề tôi nghĩ mọi người bao gồm là chúng tôi đang đặt tệp xml này ở đâu
Lpc_dark

15
Điều này không hoàn hảo. Phiên bản 3-param của Inflater nên được sử dụng - đây là lý do: doubleencore.com/2013/05/layout-inflation-as-intends
Nick Cardoso

3
Câu trả lời là không chính xác, ngay cả khi nó hoạt động. Vui lòng kiểm tra bài đăng này possiblemobile.com/2013/05/layout-inflation-as-intends
ARK

107

Bạn thổi phồng một tài nguyên XML. Xem tài liệu LayoutInflater .

Nếu bố cục của bạn nằm trong tệp mylayout.xml , bạn sẽ làm một cái gì đó như:

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
Tôi có quan điểm chính của tôi tăng cao. Vấn đề là tôi muốn thổi phồng một phần của nó từ tệp XML khác. Mục này RelativeLayout là một phần của bố cục lớn hơn và tôi muốn điền nó với bố cục từ một tệp XML khác.
Michal Dymel

hum Tôi xin lỗi sau đó tôi không có manh mối :(. Bạn có đang sử dụng một cái gì đó như <include> trong chế độ xem chính của bạn để bao gồm bố cục khác không?
ccheneson

Không, đó là cách bố trí đơn giản. Tôi nghĩ rằng tôi sẽ chỉ thêm các phần tử của mình theo chương trình - không có XML. Cảm ơn vì sự giúp đỡ!
Michal Dymel

27

Mặc dù trả lời muộn, nhưng muốn thêm một cách để có được điều này

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

nơi itemlà cách bố trí cha mẹ nơi bạn muốn thêm một bố trí con.


(thậm chí sau này vẫn còn) Tôi đang gặp khó khăn khi thực hiện câu trả lời của bạn. Tôi đã thử mã bạn đã đề cập ở trên nhưng thay thế 'mục' bằng: 'R.layout.activity_layout' Tôi đang nhận được "Không có phương pháp áp dụng nào cho '(int, int)'" Tôi có thể gây rắc rối cho bạn vì suy nghĩ của bạn không?
Kyle

1
@Kyle - thậm chí sau này vẫn còn. Bạn không thể sử dụng Rtài nguyên làm tài liệu tham khảo cho một đối tượng, chúng chỉ là ints. Bạn phải sử dụng findViewByIdtruyền Rtài nguyên đó, sau đó nhập cast vào đối tượng mong muốn. Sau đó, bạn có thể sử dụng nó trong các cuộc gọi chức năng như thế nào inflate. (tức là ViewGroup item = (ViewGroup) findViewById(R.layout.activity_layout);... sau đó bạn có thể sử dụng itemnhư trên.)
Pimp Trizkit

Tôi đoán tôi nên sử dụng RelativeLayoutthay vì ViewGroupcó trong ví dụ của tôi ở trên, vì bạn không thể khởi tạo lớp cơ sở ViewGroup. Quy tắc chỉnh sửa 5 phút đã giúp tôi. lol
Pimp Trizkit

Có thể ẩn phụ huynh và chỉ hiển thị chế độ xem con
NovusMobile

Cảm ơn, phương pháp này đã giúp tôi không thể sử dụng getContext () trong ví dụ trước vì tôi đang sử dụng các đoạn.
RightHandedMonkey

19

Thật hữu ích khi thêm vào điều này, mặc dù đó là một bài viết cũ, rằng nếu chế độ xem trẻ em bị thổi phồng từ xml sẽ được thêm vào bố cục nhóm xem, bạn cần gọi thổi phồng với đầu mối về loại nhóm xem nào được thêm vào. Giống:

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

Phương thức lạm phát khá quá tải và mô tả phần này của việc sử dụng trong các tài liệu. Tôi đã gặp sự cố khi một chế độ xem được thổi phồng từ xml không phù hợp với cha mẹ cho đến khi tôi thực hiện loại thay đổi này.


Cuối cùng, cảm ơn bạn :) Điều này cho phép thêm nhiều chế độ xem cho một phụ huynh, nhưng không cần phải lo lắng về LayoutParams - được đọc từ XML. Làm tốt lắm!
Sabo

13

Cách đơn giản hơn là sử dụng

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

Sử dụng View.inflate()là cách tốt nhất, không cần thiết LayoutInflaterhoặc getSystemService(Context.LAYOUT_INFLATER_SERVICE)hoặc bất kỳ của tất cả các phiền toái đó! : D
varun

8

lạm phát bố trí

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

6

Nếu bạn không ở trong một hoạt động, bạn có thể sử dụng from()phương thức tĩnh từ LayoutInflaterlớp để nhận a LayoutInflaterhoặc yêu cầu dịch vụ từ phương thức ngữ cảnh 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);

(Tôi biết cách đây gần 4 năm nhưng vẫn đáng nói)


4

Nếu bạn muốn thêm một lượt xem nhiều lần thì bạn phải sử dụng

   layoutInflaterForButton = getActivity().getLayoutInflater();

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

Nếu bạn thích

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

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

sau đó nó sẽ ném ngoại lệ của tất cả các chế độ xem đã thêm.


4

AttachToRoot Đặt thành True

Chỉ cần nghĩ rằng chúng tôi đã chỉ định một nút trong tệp bố cục XML với chiều rộng bố cục và chiều cao bố cục của nó được đặt thành 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>

Trên các nút này Nhấp vào sự kiện Chúng ta có thể đặt mã sau để tăng bố cục cho hoạt động này.

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

Hy vọng giải pháp này hiệu quả với bạn.!


3

Hãy thử mã này:

  1. Nếu bạn chỉ muốn làm tăng bố cục của bạn:

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. Nếu bạn muốn tăng bố cục của bạn trong container (bố trí cha mẹ):

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

Tôi đã có thời gian khó khăn nhất với lỗi này, vì hoàn cảnh độc đáo của tôi, nhưng cuối cùng đã tìm ra giải pháp.

Tình huống của tôi: Tôi đang sử dụng một chế độ xem riêng (XML) chứa một WebView, sau đó mở ra AlertDialogkhi tôi nhấp vào nút trong chế độ xem hoạt động chính của mình. Nhưng bằng cách này hay cách khác WebViewthuộc về chế độ xem hoạt động chính (có thể do tôi lấy tài nguyên từ đây), vì vậy ngay trước khi tôi gán nó cho AlertDialog(như một chế độ xem), tôi phải đưa cha mẹ của mình WebView, đặt nó vào ViewGroup, sau đó loại bỏ tất cả các quan điểm về điều đó ViewGroup. Điều này đã làm việc, và lỗi của tôi đã biến mất.

// 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...

.... sau này sau khi tôi tải 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

Nếu bạn đang cố gắn một chế độ xem con vào RelativeLayout? bạn có thể làm bằng cách làm theo

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

1

Với Kotlin, bạn có thể sử dụng:

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

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

-1

Tôi đã sử dụng đoạn mã dưới đây cho nó và nó hoạt động với tôi.

LinearLayout linearLayout = (LinearLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
linearLayout.addView(child);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.