Иногда для вашего макета требуются сложные представления, которые используются редко. Будь то сведения об элементе, индикаторы выполнения или сообщения об отмене, вы можете сократить использование памяти и ускорить рендеринг, загружая представления только тогда, когда они необходимы.
Вы можете отложить загрузку ресурсов, если у вас есть сложные представления, которые понадобятся вашему приложению в будущем, определив 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:
Если вы хотите загрузить макет, указанный 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); }
Будучи видимым или развернутым, элемент ViewStub
больше не является частью иерархии представлений. Он заменяется завышенным макетом, а идентификатор корневого представления этого макета указывается атрибутом android:inflatedId
ViewStub
. Идентификатор android:id
, указанный для ViewStub
, действителен только до тех пор, пока макет ViewStub
не станет видимым или развернутым.
Дополнительную информацию по этой теме можно найти в записи блога Оптимизация с помощью заглушек .