Atrasar o carregamento de visualizações

Às vezes, seu layout pode exigir visualizações complexas que raramente são usadas. Sejam detalhes do item, indicadores de progresso ou mensagens de reversão, você poderá reduzir o uso da memória e acelerar a renderização carregando as visualizações somente quando elas forem necessárias.

Adiar o carregamento de recursos é uma técnica importante para usar quando você tem visualizações complexas que o app pode precisar no futuro. Você pode implementar essa técnica definindo uma ViewStub para as visualizações complexas e raramente usadas.

Definir uma ViewStub

A ViewStub é uma visualização leve, sem dimensão e que não desenha nada nem participa do layout. Assim, é barato inflar e sair de uma hierarquia de visualização. Cada ViewStub só precisa incluir o atributo android:layout para especificar o layout a ser inflado.

A ViewStub a seguir é de uma sobreposição de barra de progresso translúcida. Ela precisa ficar visível apenas quando novos itens estiverem sendo importados para o app.

<ViewStub
    android:id="@+id/stub_import"
    android:inflatedId="@+id/panel_import"
    android:layout="@layout/progress_overlay"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom" />

Carregar o layout da ViewStub

Quando você quiser carregar o layout especificado pela ViewStub, defina a visibilidade dele chamando setVisibility(View.VISIBLE) ou inflate().

Kotlin

findViewById<View>(R.id.stub_import).visibility = View.VISIBLE
// or
val importPanel: View = findViewById<ViewStub>(R.id.stub_import).inflate()

Java

findViewById(R.id.stub_import).setVisibility(View.VISIBLE);
// or
View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();

Observação: o método inflate() retorna a View inflada depois de concluída. Assim, não vai ser necessário chamar findViewById() se você precisar interagir com o layout.

Depois de visível/inflado, o elemento ViewStub não faz mais parte da hierarquia de visualização. Ele é substituído pelo layout inflado, e o ID da visualização raiz desse layout é aquele especificado pelo atributo android:inflatedId da ViewStub. O ID android:id especificado para a ViewStub é válido somente até o layout dela ficar visível/inflado.

Observação: uma desvantagem da ViewStub é que ela não tem suporte à tag <merge> nos layouts a serem inflados.

Para mais informações sobre esse tópico, consulte a postagem de blog Otimizar com stubs (link em inglês).