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


175

나는이 xml두 textviews A / B와보기 C. 내가이 개 다른이와 주요 -layout 파일 xml-layout 파일 option1option2. 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.