답변:
언제든지 모든보기를 바꿀 수 있습니다.
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 레이아웃을 재구성하려는 경우 "인덱스"값 이상을 걱정할 필요가 없습니다.
android.app.FragmentTransaction
하고 그건 replace()
방법.
그리고 자주 그렇게하면 ViewSwitcher 또는 ViewFlipper 를 사용하여 뷰 대체를 쉽게 할 수 있습니다.
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);
}
내 경우에는 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);
}