Bố cục Android thay thế một chế độ xem bằng một chế độ xem khác về thời gian chạy


175

Tôi có một xmltập tin -layout chính với hai TextView A / B và một cái nhìn C. Tôi có hai khác xmlfile -layout option1option2. Có thể tải một trong hai option1hoặc option2trong thời gian chạy qua Java vào C không? Nếu vậy, tôi phải sử dụng chức năng gì?

Câu trả lời:


372

Bạn có thể thay thế bất kỳ chế độ xem bất cứ lúc nào.

int optionId = someExpression ? R.layout.option1 : R.layout.option2;

View C = findViewById(R.id.C);
ViewGroup parent = (ViewGroup) C.getParent();
int index = parent.indexOfChild(C);
parent.removeView(C);
C = getLayoutInflater().inflate(optionId, parent, false);
parent.addView(C, index);

Nếu bạn không muốn thay thế Chế độ xem đã có , nhưng chọn giữa tùy chọn1 / tùy chọn 2 tại thời điểm khởi tạo, thì bạn có thể thực hiện việc này dễ dàng hơn: đặt android:idcho bố cục chính và sau đó:

ViewGroup parent = (ViewGroup) findViewById(R.id.parent);
View C = getLayoutInflater().inflate(optionId, parent, false);
parent.addView(C, index);

Bạn sẽ phải đặt "chỉ mục" thành giá trị phù hợp tùy thuộc vào cấu trúc lượt xem. Bạn cũng có thể sử dụng ViewStub : thêm chế độ xem C của bạn dưới dạng ViewStub và sau đó:

ViewStub C = (ViewStub) findViewById(R.id.C);
C.setLayoutResource(optionId);
C.inflate();

Bằng cách đó, bạn sẽ không phải lo lắng về giá trị "chỉ mục" ở trên nếu bạn muốn cơ cấu lại bố cục XML của mình.


Tôi phải loại bỏ mảnh vỡ, hay mảnh vỡ cũng sẽ bị loại bỏ?
K - Độc tính trong SO đang tăng lên.

3
@KarlMorrison Câu hỏi này đã gần 4 tuổi và không liên quan gì đến những mảnh vỡ. Tôi đề nghị gửi một câu hỏi mới và / hoặc xem xét android.app.FragmentTransactionreplace()phương pháp của nó .
lupz

Thật đáng tiếc câu trả lời của bạn quá phức tạp - trong các bình luận - dành cho các lập trình viên Android mới làm quen :-(
Antonio Sesto

2
@AntonioSesto có gì quá phức tạp? Bạn đã nhầm lẫn ở đâu?
AdamMc331

@broot Tôi muốn thêm hình ảnh hàng ngày vào linearlayout mà tôi đã thực hiện. sau đó tôi loại bỏ một số hình ảnh từ bố trí. sau đó tôi muốn khôi phục nó ở vị trí của chính nó từ nơi tôi đã gỡ bỏ. có nghĩa là tôi muốn thêm hình ảnh mà không loại bỏ cha mẹ của con bạn, bạn có thể vui lòng ôm tôi không?
PriyankaChauhan

43

Và nếu bạn làm điều đó rất thường xuyên, bạn có thể sử dụng ViewSwitcher hoặc ViewFlipper để dễ dàng thay thế chế độ xem.


Có, nếu có câu hỏi về chế độ xem thay thế, thì hãy xem flipper / switcher để sử dụng tốt hơn
Zoombie

2
@Shail Adi, bạn đã thử goole mã hướng dẫn ViewSwitcher chưa?
Snicolas

Tôi biết điều này đã cũ - nhưng điều đáng chú ý là ViewSwitcher khởi tạo và giữ cả hai Chế độ xem trong chính nó (một FrameLayout).
Vikram Bod Richla

Đây nên là câu trả lời đề nghị. Tại sao không chỉ sử dụng một giải pháp đã được thực hiện tốt thử nghiệm.

3
private void replaceView(View oldV,View newV){
        ViewGroup par = (ViewGroup)oldV.getParent();
        if(par == null){return;}
        int i1 = par.indexOfChild(oldV);
        par.removeViewAt(i1);
        par.addView(newV,i1);
    }

6
Mặc dù mã này có thể trả lời câu hỏi, cung cấp ngữ cảnh bổ sung về cách thức và / hoặc lý do giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời
frobinsonj

0

nó hoạt động trong trường hợp của tôi, oldSensor và newSnsor - oldView và newView:

private void replaceSensors(View oldSensor, View newSensor) {
            ViewGroup parent = (ViewGroup) oldSensor.getParent();

            if (parent == null) {
                return;
            }

            int indexOldSensor = parent.indexOfChild(oldSensor);
            int indexNewSensor = parent.indexOfChild(newSensor);
            parent.removeView(oldSensor);
            parent.addView(oldSensor, indexNewSensor);
            parent.removeView(newSensor);
            parent.addView(newSensor, indexOldSensor);
        }
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.