À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:layout
para 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).