런타임에 뷰를 다른 뷰로 대체하는 Android 레이아웃


175

나는이 xml두 textviews A / B와보기 C. 내가이 개 다른이와 주요 -layout 파일 xml-layout 파일 option1과 option2. Java를 통해 option1또는 option2런타임으로 C로 C 를로드 할 수 있습니까? 그렇다면 어떤 기능을 사용해야합니까?

답변:


372

언제든지 모든보기를 바꿀 수 있습니다.

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);

이미 존재하는 View 를 바꾸고 싶지 않지만 초기화 할 때 option1 / option2 중에서 선택하면 android:id부모 레이아웃으로 설정 한 다음 다음을 쉽게 수행 할 수 있습니다 .

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

뷰 구조에 따라 "인덱스"를 적절한 값으로 설정해야합니다. ViewStub 을 사용할 수도 있습니다 : C보기를 ViewStub으로 추가 한 다음 :

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

이렇게하면 XML 레이아웃을 재구성하려는 경우 "인덱스"값 이상을 걱정할 필요가 없습니다.


조각을 제거해야합니까, 아니면 조각도 제거됩니까?
— K-SO의 독성이 증가하고 있습니다.

3
@KarlMorrison이 질문은 거의 4 살이며 조각과 관련이 없습니다. 나는 새 질문을 파일 및 / 또는에서 살펴보고 제안 android.app.FragmentTransaction하고 그건 replace()방법.
— lupz

코멘트에 - - :-( 초보자 안드로이드 프로그래머를위한 그것은 당신의 대답은 너무 복잡 유감입니다
— 안토니오 스토

2
@AntonioSesto 너무 복잡한 것은 무엇입니까? 어디서 혼란 스러웠습니까?
— AdamMc331

@ broot 내가 한 일을 linearlayout에 daynamically 이미지를 추가하고 싶습니다. 나중에 레이아웃에서 일부 이미지를 제거합니다. 그런 다음 제거한 위치에서 자체 위치로 복원하고 싶습니다. 자녀의 부모를 제거하지 않고 이미지를 추가하고 싶다는 것을 의미합니까?
— PriyankaChauhan

43

그리고 자주 그렇게하면 ViewSwitcher 또는 ViewFlipper 를 사용하여 뷰 대체를 쉽게 할 수 있습니다.


예, 대체보기에 대한 질문이있는 경우보기 플리퍼 / 스위처를 사용하는 것이 좋습니다.
— Zoombie

2
@Shail Adi, ViewSwitcher 튜토리얼 코드를 goole하려고 했습니까?
— Snicolas

나는 이것이 오래되었다는 것을 알고 있지만주의 사항은 ViewSwitcher가 두 Views 자체를 초기화하고 보유한다는 것입니다 (FrameLayout).
— Vikram Bodicherla

이것이 권장되는 답변이어야합니다. 잘 준비된 테스트를 거친 솔루션 만 사용하십시오.

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
이 코드는 질문에 대답 할 수 있지만, 문제를 해결하는 방법 및 / 또는 이유에 대한 추가 컨텍스트를 제공하면 응답의 장기적 가치를 향상시킬 수 있습니다.
— frobinsonj

0

내 경우에는 oldSensor와 newSnsor-oldView와 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);
        }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.