Загрузка просмотров по запросу

Иногда для вашего макета требуются сложные представления, которые используются редко. Будь то сведения об элементе, индикаторы выполнения или сообщения об отмене, вы можете сократить использование памяти и ускорить рендеринг, загружая представления только тогда, когда они необходимы.

Вы можете отложить загрузку ресурсов, если у вас есть сложные представления, которые понадобятся вашему приложению в будущем, определив ViewStub для сложных и редко используемых представлений.

Определить ViewStub

ViewStub — это облегченное представление без размеров, которое ничего не рисует и не участвует в макете. Таким образом, для раздувания и сохранения в иерархии представлений требуется мало ресурсов. Каждый ViewStub включает атрибут android:layout , определяющий макет для надувания.

Предположим, у вас есть макет, который вы хотите загрузить позже в пути пользователя вашего приложения:

<?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>

Вы можете отложить загрузку, используя следующий ViewStub . Чтобы он показывал или загружал что-либо, вы должны показать указанный макет:

<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>

Загрузите макет ViewStub

Фрагменты кода из предыдущего раздела создают что-то вроде рисунка 1:

Изображение пустого экрана
Рисунок 1. Исходное состояние экрана: ViewStub скрывает тяжелый макет.

Если вы хотите загрузить макет, указанный ViewStub , либо сделайте его видимым, вызвав setVisibility(View.VISIBLE) , либо вызовите inflate() .

Следующий фрагмент кода имитирует отложенную загрузку. Экран загружается как обычно в Activity и onCreate() , затем отображается макет heavy_layout_we_want_to_postpone :

Котлин

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)
}

Ява

@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);
}
Рисунок 2. Виден тяжелый макет.

Будучи видимым или развернутым, элемент ViewStub больше не является частью иерархии представлений. Он заменяется завышенным макетом, а идентификатор корневого представления этого макета указывается атрибутом android:inflatedId ViewStub . Идентификатор android:id , указанный для ViewStub , действителен только до тех пор, пока макет ViewStub не станет видимым или развернутым.

Дополнительную информацию по этой теме можно найти в записи блога Оптимизация с помощью заглушек .