À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).