Carregar visualizações sob demanda

Às vezes, seu layout exige visualizações complexas que raramente são usadas. Seja detalhes do item, indicadores de progresso ou mensagens de desfazer, você pode reduzir uso de memória e acelerar a renderização carregando as visualizações somente quando necessários.

É possível adiar o carregamento de recursos quando você tem visualizações complexas das quais seu app necessidades no futuro definindo ViewStub para visualizações complexas e raramente usadas.

Definir um ViewStub

ViewStub é uma visualização leve sem dimensão desenhar qualquer coisa ou participar do layout. Por isso, ela exige poucos recursos para inflar e sair de uma hierarquia de visualização. Cada ViewStub inclui O atributo android:layout para especificar o layout a ser inflado.

Suponha que você tenha um layout que queira carregar mais tarde na jornada do usuário do seu aplicativo:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:src="@drawable/logo"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</FrameLayout>

É possível adiar o carregamento usando a ViewStub a seguir. Para fazer ele mostre ou carregue alguma coisa, você deve fazê-lo mostrar o layout referido:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent">

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

Carregar o layout da ViewStub

Os snippets de código da seção anterior produzem algo como a 1.

Imagem de uma tela vazia
Figura 1. Estado inicial da tela: o ViewStub é. esconder o layout pesado.

Quando você quiser carregar o layout especificado pela ViewStub, defina-o como visível chamando setVisibility(View.VISIBLE) ou ligue para inflate()

O snippet de código a seguir simula um carregamento adiado. A tela é carregada como de costume em Activity e onCreate(), ele será mostrado o layout heavy_layout_we_want_to_postpone:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_old_xml)

  Handler(Looper.getMainLooper())
      .postDelayed({
          findViewById<View>(R.id.stub_import).visibility = View.VISIBLE
          
          // Or val importPanel: View = findViewById<ViewStub>(R.id.stub_import).inflate()
      }, 2000)
}

Java

@Override
void onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_old_xml);

  Handler(Looper.getMainLooper())
      .postDelayed({
          findViewById<View>(R.id.stub_import).visibility = View.VISIBLE
          
          // Or val importPanel: View = findViewById<ViewStub>(R.id.stub_import).inflate()
      }, 2000);
}
Figura 2. O layout pesado fica visível.
.

Depois de visível ou inflado, o elemento ViewStub não faz mais parte. da hierarquia de visualizações. Ele será substituído pelo layout inflado e pelo ID do a visualização raiz desse layout é especificada pelo android:inflatedId do ViewStub. O ID android:id especificado para o ViewStub é válida somente até que o ViewStub está visível ou inflado.

Para mais informações sobre esse assunto, confira a postagem do blog Otimização com stubs.