Atraso no 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 desfazer, você pode 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 a ser usada quando você tem visualizações complexas das quais seu aplicativo pode precisar no futuro. Você pode implementar essa técnica definindo um ViewStub para as visualizações complexas e raramente utilizadas.

Definir um ViewStub

ViewStub é uma visualização leve sem dimensão 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:layoutpara especificar o layout a ser inflado.

O ViewStub a seguir é de uma sobreposição de barra de progresso translúcida. Ele precisa estar visível somente 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 do ViewStub

Quando você quiser carregar o layout especificado pelo ViewStub, defina-o como visível chamando setVisibility(View.VISIBLE) ou chame 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 aView inflada depois de concluída. Assim, não é 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 do ViewStub. O ID android:id especificado para o ViewStub é válido somente até o layout ViewStub ficar visível/inflado.

Observação: uma desvantagem do ViewStub é que, atualmente, ele não é compatível com a 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).