Layout do Android substituindo uma visualização por outra no tempo de execução

175

Eu tenho um xmlarquivo -layout principal com duas visualizações de texto A / B e uma exibição C. Eu tenho dois outros xmlarquivos -layout option1e option2. É possível carregar option1ou option2em tempo de execução via Java no C? Em caso afirmativo, qual função devo usar?

cristão
fonte

Respostas:

372

Você pode substituir qualquer visualização a qualquer momento.

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

Se você não deseja substituir a Visualização já existente , mas escolher entre a opção1 / opção2 no momento da inicialização, poderá fazer isso mais facilmente: defina o android:idlayout pai e:

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

Você precisará definir "índice" para o valor adequado, dependendo da estrutura de visualizações. Você também pode usar um ViewStub : adicione sua visualização C como ViewStub e, em seguida:

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

Dessa forma, você não precisará se preocupar com o valor acima do "índice" se desejar reestruturar seu layout XML.

brotar
fonte
Devo remover o fragmento ou o fragmento também será removido?
K - A toxicidade no SO está crescendo.
3
@KarlMorrison Esta pergunta tem quase 4 anos e não tem nada a ver com fragmentos. Sugiro para apresentar uma nova pergunta e / ou dar uma olhada android.app.FragmentTransactione é replace()método.
Lupz
É uma pena que sua resposta seja muito complexa - nos comentários - para programadores iniciantes em Android :-(
Antonio Sesto
2
@AntonioSesto o que é muito complexo? Onde você ficou confuso?
AdamMc331
@broot Quero adicionar imagens dinamicamente ao meu layout linear que fiz. depois, removo algumas imagens do layout. então eu quero restaurá-lo em sua própria posição de onde eu removi. significa que eu quero adicionar imagens sem remover os pais da criança, você pode me ajudar?
PriyankaChauhan
43

E se você fizer isso com muita frequência, poderá usar um ViewSwitcher ou um ViewFlipper para facilitar a substituição da exibição.

Snicolas
fonte
Sim, se há questão de pontos de vista alternativos, em seguida, visualizar flipper / switcher é melhor usar
Zoombie
2
@ Shail Adi, você tentou codificar um código do tutorial do ViewSwitcher?
Snicolas
Eu sei que isso é antigo - mas a ressalva é que um ViewSwitcher inicializa e mantém os dois modos de exibição em si (um FrameLayout).
Vikram Bodicherla /
Essa deve ser a resposta recomendada. Por que não usar apenas uma solução pronta e bem testada?
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);
    }
Kaiwalya Rangle
fonte
6
Embora esse código pode responder à pergunta, fornecendo contexto adicional a respeito de como e / ou porque ele resolve o problema iria melhorar a resposta é valor a longo prazo
frobinsonj
0

funciona no meu caso, oldSensor e newSnsor - oldView e 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);
        }
ch13mob
fonte