<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">
	<channel>
		<title>Jetpack Compose - Build Your Android User Interface | Infinum</title>
		<atom:link href="https://infinum.com/blog/jetpack-compose-framework/feed/" rel="self" type="application/rss+xml" />
		<link>https://infinum.com/blog/jetpack-compose-framework/</link>
		<description>Building digital products</description>
		<lastBuildDate>Tue, 21 Apr 2026 07:48:55 +0000</lastBuildDate>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>

					<item>
				<image>
					<url>7958https://infinum.com/uploads/2021/05/jetpack-compose-framework-0.webp</url>
				</image>
				<title>Android, Meet Jetpack Compose!</title>
				<link>https://infinum.com/blog/jetpack-compose-framework/</link>
				<pubDate>Fri, 21 May 2021 11:20:00 +0000</pubDate>
				<dc:creator>Josip Šalković</dc:creator>
				<guid isPermaLink="false">https://infinum.com/the-capsized-eight/jetpack-compose-framework/</guid>
				<description>
					<![CDATA[<p>Jetpack Compose is a modern declarative framework designed for building a native Android user interface.</p>
<p>The post <a href="https://infinum.com/blog/jetpack-compose-framework/">Android, Meet Jetpack Compose!</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-355"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-92">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-95"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-93">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-94'
	>
	Are you looking for a modern declarative framework designed for building a native Android user interface? Jetpack Compose makes writing and maintaining our UI easier, features Material Design support for theming, is compatible with the existing view-based architecture, and is built entirely on top of Kotlin.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-98"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-96">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-97'
	>
	On the recently hosted I/O, Google announced that <a href="https://android-developers.googleblog.com/2021/05/whats-new-for-android-developers-at.html">Jetpack Compose would hit the stable version in July</a>, so the time is right to get up to speed.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-101"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-99">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-100'
	>
	What is a declarative framework?</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-104"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-102">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-103'
	>
	Usually, an Android view is a tree representation of widgets. As the application state changes due to various user events, we must update the widgets accordingly. The most common way to do that is to walk the tree using functions like <strong><code>findViewById()</code></strong> and change the internal state of the widget.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-107"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-105">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-106'
	>
	Manual manipulation of views increases the possibility of state inconsistency. Imagine that you have a complex UI with a lot of <strong><code>TextViews</code></strong>, <strong><code>Buttons</code></strong>, and <strong><code>ImageViews</code></strong>. Application state changes and user interface needs to be updated. If we forget to update at least one widget that should be updated with new data, the result is inconsistency between states. And here comes a declarative UI model to the rescue.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-110"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-108">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-109'
	>
	A declarative UI model regenerates an entire screen from scratch when the state changes. With this approach, we avoid the complexity of manually updating the view-based hierarchy and also reduce potentially forgotten updated views.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-115"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="blockquote block-blockquote__blockquote" data-id="es-111">
	
	<div class="blockquote__content">
		<i
	class="icon blockquote__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='blockquote-24' data-id='es-112'>
	<svg fill='none' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path clip-rule='evenodd' d='m12 24c6.6274 0 12-5.3726 12-12 0-2.79685-.9568-5.37021-2.561-7.41062-.581.22951-1.0832.60583-1.5069 1.12898-.5132.60844-.7698 1.41969-.7698 2.43375v.07605h2.5789v5.59004h-5.6197v-5.01962c0-1.11547.154-2.06616.4619-2.85205.3336-.81125.757-1.48307 1.2702-2.01545.528-.52161 1.1175-.92155 1.7687-1.1998-2.0728-1.70651-4.7279-2.73128-7.6223-2.73128-6.62742 0-12 5.37258-12 12 0 6.6274 5.37258 12 12 12zm-3.53811-18.05347c-.30793.78589-.46189 1.73658-.46189 2.85205v5.01962h5.6197v-5.59004h-2.5789v-.07605c0-1.01406.2566-1.82531.7698-2.43375.5389-.63379 1.1804-1.05209 1.9245-1.2549v-2.28164c-.7441.07605-1.4626.25351-2.1555.53238-.6928.27887-1.3086.68449-1.84752 1.21688-.51321.53238-.9366 1.2042-1.27019 2.01545z' fill='currentColor' fill-rule='evenodd'/></svg></i><p	class='typography typography--size-36-text js-typography blockquote__quote'
	data-id='es-113'
	>
	Regenerating the entire screen is expensive, and Jetpack Compose is smart enough to detect which parts of the user interface need to be redrawn at any time.</p>
		<div class="blockquote__caption-wrap">
					</div>
	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-118"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-116">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-117'
	>
	Styling in Jetpack Compose: Layouts and theming</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-121"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-119">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-120'
	>
	Before diving deeper into Jetpack Compose, you must <a href="https://developer.android.com/studio/preview">download and install the latest beta version of Android Studio Preview</a> to use Compose functionalities. The latest beta version of Android Studio Preview provides core features such as a New Project template for Compose and the ability to preview Composable functions.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-124"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-122">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-123'
	>
	Jetpack Compose Setup</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-127"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-125">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-126'
	>
	If you want to start a new project, navigate to templates, select Empty Compose Activity, and IDE will do the rest.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-130"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-128">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-129'
	>
	If you want to integrate Compose into an existing project, you must configure your project with the required settings and dependencies.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-133"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-131">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-132'
	>
	Make sure that you are using Kotlin 1.4.30 or newer inside your project:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-135"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">buildscript </span><span class="token">{
</span></span><span class="line"><span class="token">    </span><span class="token">ext </span><span class="token">{
</span></span><span class="line"><span class="token">        kotlin_version </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">1.4.32</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">        compose_version </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">1.0.0-beta07</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #d73a49;">..</span><span class="token">.
</span></span><span class="line"><span class="token">    }
</span></span><span class="line"><span class="token">    </span><span class="token">dependencies </span><span class="token">{
</span></span><span class="line"><span class="token">        classpath </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">org.jetbrains.kotlin:kotlin-gradle-plugin:</span><span class="token" style="color: #005cc5;">$kotlin_version</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #d73a49;">..</span><span class="token">.
</span></span><span class="line"><span class="token">    }
</span></span><span class="line"><span class="token">}
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-138"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-136">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-137'
	>
	Next, ensure the minimum supported API version is set to 21 or higher, as shown below. Also, do not forget to enable the Jetpack Compose feature, set the Kotlin compiler settings, and add Compose-related dependencies:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-140"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">android </span><span class="token">{
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">defaultConfig </span><span class="token">{
</span></span><span class="line"><span class="token">        minSdkVersion </span><span class="token" style="color: #005cc5;">21</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #d73a49;">..</span><span class="token">.
</span></span><span class="line"><span class="token">    }
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">compileOptions </span><span class="token">{
</span></span><span class="line"><span class="token">        sourceCompatibility JavaVersion.VERSION_1_8
</span></span><span class="line"><span class="token">        targetCompatibility JavaVersion.VERSION_1_8
</span></span><span class="line"><span class="token">    }
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">kotlinOptions </span><span class="token">{
</span></span><span class="line"><span class="token">        jvmTarget </span><span class="token" style="color: #d73a49;">=</span><span class="token"> JavaVersion.VERSION_1_8
</span></span><span class="line"><span class="token">        useIR </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">true</span><span class="token">
</span></span><span class="line"><span class="token">    }
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">buildFeatures </span><span class="token">{
</span></span><span class="line"><span class="token">        compose </span><span class="token" style="color: #005cc5;">true</span><span class="token">
</span></span><span class="line"><span class="token">    }
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">composeOptions </span><span class="token">{
</span></span><span class="line"><span class="token">        kotlinCompilerExtensionVersion compose_version
</span></span><span class="line"><span class="token">        kotlinCompilerVersion kotlin_version
</span></span><span class="line"><span class="token">    }
</span></span><span class="line"><span class="token">}
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">dependencies </span><span class="token">{
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    implementation </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">androidx.compose.ui:ui:</span><span class="token" style="color: #005cc5;">$compose_version</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">    implementation </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">androidx.compose.material:material:</span><span class="token" style="color: #005cc5;">$compose_version</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">    implementation </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">androidx.compose.ui:ui-tooling:</span><span class="token" style="color: #005cc5;">$compose_version</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">    implementation </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">androidx.compose.runtime:runtime-livedata:</span><span class="token" style="color: #005cc5;">$compose_version</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">androidTestImplementation</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">androidx.compose.ui:ui-test-junit4:</span><span class="token" style="color: #005cc5;">$compose_version</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)
</span></span><span class="line"><span class="token">    implementation </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">androidx.activity:activity-compose:1.3.0-alpha08</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">    implementation </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-alpha05</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">..</span><span class="token">.
</span></span><span class="line"><span class="token">}
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-143"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-141">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-142'
	>
	Getting started with Jetpack Compose</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-146"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-144">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-145'
	>
	Let’s look at an example including a simple image and the corresponding text emitted on screen. To do that, we need to call composable functions from the <strong><code>setContent</code></strong> block. Composable functions are regular functions annotated with <strong><code>@Composable</code></strong>, emitting UI elements and showing them on screen.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-149"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-147">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-148'
	>
	You must annotate all composable functions with <strong><code>@Composable</code></strong> because it tells the Compose compiler that the function is intended to convert data into UI. Composable functions don’t return anything, they only describe some piece of UI, and are written with the first uppercase letter.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-152"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-150">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-151'
	>
	Declare the following composable function:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-154"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #6f42c1;">@Composable</span><span class="token">
</span></span><span class="line"><span class="token">fun InfinumContent</span><span class="token">() {
</span></span><span class="line"><span class="token">   </span><span class="token">Image</span><span class="token">(
</span></span><span class="line"><span class="token">       painter </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">painterResource</span><span class="token">(id </span><span class="token" style="color: #d73a49;">=</span><span class="token"> R.drawable.ic_infinum_mark),
</span></span><span class="line"><span class="token">       contentDescription </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">stringResource</span><span class="token">(id </span><span class="token" style="color: #d73a49;">=</span><span class="token"> R.string.infinum_mark_description)
</span></span><span class="line"><span class="token">   )
</span></span><span class="line"><span class="token">   </span><span class="token">Text</span><span class="token">(
</span></span><span class="line"><span class="token">       text </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">stringResource</span><span class="token">(id </span><span class="token" style="color: #d73a49;">=</span><span class="token"> R.string.infinum)
</span></span><span class="line"><span class="token">   )
</span></span><span class="line"><span class="token">}
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-157"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-155">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-156'
	>
	<strong><code>Text</code></strong> is a composable function that emits text on the screen and its <strong><code>TextView</code></strong> equivalent in regular view-based UI. <strong><code>Image</code></strong> is a composable function for emitting images on screen, and it is equivalent to <strong><code>ImageView</code></strong>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-160"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-158">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-159'
	>
	Open or create <strong><code>MainActivity</code></strong> and paste the following:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-162"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">class MainActivity </span><span class="token">: </span><span class="token" style="color: #6f42c1;">AppCompatActivity</span><span class="token">() {
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">   </span><span class="token" style="color: #d73a49;">override</span><span class="token"> </span><span class="token">fun onCreate</span><span class="token">(savedInstanceState</span><span class="token">: </span><span class="token" style="color: #6f42c1;">Bundle</span><span class="token">?</span><span class="token">) {
</span></span><span class="line"><span class="token">       </span><span class="token" style="color: #005cc5;">super</span><span class="token">.onCreate</span><span class="token">(savedInstanceState)
</span></span><span class="line"><span class="token">       </span><span class="token">setContent </span><span class="token">{
</span></span><span class="line"><span class="token">          </span><span class="token">InfinumContent</span><span class="token">()
</span></span><span class="line"><span class="token">       }
</span></span><span class="line"><span class="token">   }
</span></span><span class="line"><span class="token">}
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-165"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-163">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-164'
	>
	<strong><code>setContent</code></strong> is the composable equivalent to <strong><code>setContentView</code></strong>. It composes given composables inside the block. This means that the content declared inside the block will become the root view of a given activity; in this example <strong><code>MainActivity</code></strong>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-168"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-166"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-167">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2021/04/jetpack-compose-framework-1.webp"
					class="image__img block-media__image-img"
					alt=""
										height="672"
															width="947"
										loading="lazy"
					 />
					</picture>

			<figcaption class="image__figcaption block-media__image-figcaption">
			Output on the emulator		</figcaption>
	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-171"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-169">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-170'
	>
	Previewing layouts with Jetpack Compose</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-174"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-172">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-173'
	>
	Instead of running the project every time a change occurs, Android Studio provides a feature for previewing layouts and how they will appear on screen. Declare another composable function and annotate it with <strong><code>@Preview</code></strong>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-177"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-175">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-176'
	>
	Within it, call a composable function that you initially want to inspect. Preview composable functions don’t accept parameters. If we want to inspect how <strong><code>InfinumContent</code></strong> shows on screen, we can achieve this by declaring the preview composable function as follows:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-179"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #6f42c1;">@Preview</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">@Composable</span><span class="token">
</span></span><span class="line"><span class="token">fun PreviewInfinumContent</span><span class="token">() </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">InfinumContent</span><span class="token">()
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-182"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-180"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-181">
	<picture class="image__picture block-media__image-picture">
								
			<source
				srcset=https://infinum.com/uploads/2021/04/jetpack-compose-framework-2-1400x682.webp				media='(max-width: 699px)'
				type=image/webp								height="682"
												width="1400"
				 />
												<img
					src="https://infinum.com/uploads/2021/04/jetpack-compose-framework-2.webp"
					class="image__img block-media__image-img"
					alt=""
										height="779"
															width="1600"
										loading="lazy"
					 />
					</picture>

			<figcaption class="image__figcaption block-media__image-figcaption">
			Android Studio will automatically generate The preview layout for you.		</figcaption>
	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-185"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-183">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-184'
	>
	Basic layouts in Jetpack Compose</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-188"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-186">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-187'
	>
	Now that we have learned how to create a simple view, we can discuss possible layout variations. Jetpack Compose provides a<strong><code>Row</code></strong>, composable layout that places its children in a horizontal sequence. It is equivalent to <strong><code>LinearLayout</code></strong> with horizontal orientation.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-191"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-189">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-190'
	>
	For a vertical sequence of children, there is a <strong><code>Column</code></strong> composable. It is equivalent to <strong><code>LinearLayout</code></strong> with vertical orientation. In this example, we want the text to show after the logo and we can achieve that by writing the following snippet:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-193"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #6f42c1;">@Composable</span><span class="token">
</span></span><span class="line"><span class="token">fun InfinumContent</span><span class="token">() {
</span></span><span class="line"><span class="token">   </span><span class="token">Row</span><span class="token">(verticalAlignment </span><span class="token" style="color: #d73a49;">=</span><span class="token"> Alignment.CenterVertically) {
</span></span><span class="line"><span class="token">       </span><span class="token" style="color: #d73a49;">..</span><span class="token">.
</span></span><span class="line"><span class="token">   }
</span></span><span class="line"><span class="token">}
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-196"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-194"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-195">
	<picture class="image__picture block-media__image-picture">
								
			<source
				srcset=https://infinum.com/uploads/2021/04/jetpack-compose-framework-3-1400x491.webp				media='(max-width: 699px)'
				type=image/webp								height="491"
												width="1400"
				 />
												<img
					src="https://infinum.com/uploads/2021/04/jetpack-compose-framework-3.webp"
					class="image__img block-media__image-img"
					alt=""
										height="561"
															width="1600"
										loading="lazy"
					 />
					</picture>

			<figcaption class="image__figcaption block-media__image-figcaption">
			Corresponding preview of the InfinumContent composable.		</figcaption>
	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-199"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-197">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-198'
	>
	Other layouts that we will use often are:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-202"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-200">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-201'
	>
	<li><strong><code>Box</code></strong> – allows us to have items behind and/or in front of others and it is equivalent to <code>FrameLayout</code> in view-based UI<ul><li><strong><code>ConstraintLayout</code></strong> – helps us place composables relative to others on the screen and as the name implies, equivalent to the same layout in view-based UI</li></ul><ul><li><strong><code>LazyColumn</code></strong> – <code>RecyclerView</code> with <code>LinearLayoutManager</code> equivalent in view-based UI</li></ul><ul><li><strong><code>LazyRow</code></strong> – <code>RecyclerView</code> with <code>LinearLayoutManager.HORIZONTAL</code> equivalent in view-based UI</li></ul></li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-205"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-203">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-204'
	>
	Theming in Jetpack Compose</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-208"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-206">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-207'
	>
	The previous section shows how quickly we can build a piece of UI with Jetpack Compose. Moving on to cover theming in Compose, it comes with Material Design built-in support which is easy to customize. In case you are unfamiliar with Material Design, it is a design system for digital interfaces that is comprised of colors, typography, and shape attributes.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-211"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-209">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-210'
	>
	Colors in Jetpack Compose</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-214"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-212">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-213'
	>
	The usual practice in Compose is to declare colors inside the <strong><code>Color.kt</code></strong> file, which is equivalent to <strong><code>colors.xml</code></strong> in view-based UI.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-217"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-215">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-216'
	>
	Create the file and define just one custom red color variant as follows:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-219"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">val </span><span class="token">InfinumRed </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">Color</span><span class="token">(</span><span class="token" style="color: #005cc5;">0xFFD9262B</span><span class="token">)
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-222"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-220">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-221'
	>
	Jetpack Compose provides support for Light and Dark Theme, leaving you to declare which colors will be displayed where. It is best to put everything theme-related inside the <strong><code>Theme.kt</code></strong> file which is equivalent to <strong><code>themes.xml</code></strong> in view-based UI.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-225"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-223">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-224'
	>
	We will define our Dark and Light Color palettes, put them inside the file mentioned above and use the defined custom color and other default ones:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-227"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">private</span><span class="token"> </span><span class="token">val </span><span class="token">DarkColorPalette </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">darkColors</span><span class="token">(
</span></span><span class="line"><span class="token">   primary </span><span class="token" style="color: #d73a49;">=</span><span class="token"> InfinumRed,
</span></span><span class="line"><span class="token">   primaryVariant </span><span class="token" style="color: #d73a49;">=</span><span class="token"> InfinumRed,
</span></span><span class="line"><span class="token">   secondary </span><span class="token" style="color: #d73a49;">=</span><span class="token"> InfinumRed,
</span></span><span class="line"><span class="token">   background </span><span class="token" style="color: #d73a49;">=</span><span class="token"> Color.Black,
</span></span><span class="line"><span class="token">   surface </span><span class="token" style="color: #d73a49;">=</span><span class="token"> Color.DarkGray,
</span></span><span class="line"><span class="token">   onPrimary </span><span class="token" style="color: #d73a49;">=</span><span class="token"> Color.White,
</span></span><span class="line"><span class="token">   onSecondary </span><span class="token" style="color: #d73a49;">=</span><span class="token"> Color.White,
</span></span><span class="line"><span class="token">   onBackground </span><span class="token" style="color: #d73a49;">=</span><span class="token"> Color.White,
</span></span><span class="line"><span class="token">   onSurface </span><span class="token" style="color: #d73a49;">=</span><span class="token"> Color.White
</span></span><span class="line"><span class="token">)
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">private</span><span class="token"> </span><span class="token">val </span><span class="token">LightColorPalette </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">lightColors</span><span class="token">(
</span></span><span class="line"><span class="token">   primary </span><span class="token" style="color: #d73a49;">=</span><span class="token"> InfinumRed,
</span></span><span class="line"><span class="token">   primaryVariant </span><span class="token" style="color: #d73a49;">=</span><span class="token"> InfinumRed,
</span></span><span class="line"><span class="token">   secondary </span><span class="token" style="color: #d73a49;">=</span><span class="token"> InfinumRed,
</span></span><span class="line"><span class="token">   background </span><span class="token" style="color: #d73a49;">=</span><span class="token"> Color.White,
</span></span><span class="line"><span class="token">   surface </span><span class="token" style="color: #d73a49;">=</span><span class="token"> Color.White,
</span></span><span class="line"><span class="token">   onPrimary </span><span class="token" style="color: #d73a49;">=</span><span class="token"> Color.White,
</span></span><span class="line"><span class="token">   onSecondary </span><span class="token" style="color: #d73a49;">=</span><span class="token"> Color.Black,
</span></span><span class="line"><span class="token">   onBackground </span><span class="token" style="color: #d73a49;">=</span><span class="token"> Color.Black,
</span></span><span class="line"><span class="token">   onSurface </span><span class="token" style="color: #d73a49;">=</span><span class="token"> Color.Black
</span></span><span class="line"><span class="token">)
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-230"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-228">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-229'
	>
	In the same <strong><code>Theme.kt</code></strong> file, wrap everything into the composable function which we will call everywhere to apply custom theming:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-232"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #6f42c1;">@Composable</span><span class="token">
</span></span><span class="line"><span class="token">fun InfinumComposeAppTheme</span><span class="token">(
</span></span><span class="line"><span class="token">   darkTheme</span><span class="token">: </span><span class="token" style="color: #6f42c1;">Boolean</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">isSystemInDarkTheme</span><span class="token">(),
</span></span><span class="line"><span class="token">   content</span><span class="token">: </span><span class="token" style="color: #6f42c1;">@Composable</span><span class="token"> () </span><span class="token" style="color: #d73a49;">-&gt;</span><span class="token"> Unit
</span></span><span class="line"><span class="token">) {
</span></span><span class="line"><span class="token">   </span><span class="token">val </span><span class="token">colors </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #d73a49;">if</span><span class="token"> (darkTheme) {
</span></span><span class="line"><span class="token">       DarkColorPalette
</span></span><span class="line"><span class="token">   } </span><span class="token" style="color: #d73a49;">else</span><span class="token"> {
</span></span><span class="line"><span class="token">       LightColorPalette
</span></span><span class="line"><span class="token">   }
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">   </span><span class="token">MaterialTheme</span><span class="token">(
</span></span><span class="line"><span class="token">       colors </span><span class="token" style="color: #d73a49;">=</span><span class="token"> colors,
</span></span><span class="line"><span class="token">       content </span><span class="token" style="color: #d73a49;">=</span><span class="token"> content
</span></span><span class="line"><span class="token">   )
</span></span><span class="line"><span class="token">}
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-235"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-233">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-234'
	>
	Now, add the composable function above inside <strong><code>setContent</code></strong> before emitting content:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-237"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">override</span><span class="token"> </span><span class="token">fun onCreate</span><span class="token">(savedInstanceState</span><span class="token">: </span><span class="token" style="color: #6f42c1;">Bundle</span><span class="token">?</span><span class="token">) {
</span></span><span class="line"><span class="token">   </span><span class="token" style="color: #005cc5;">super</span><span class="token">.onCreate</span><span class="token">(savedInstanceState)
</span></span><span class="line"><span class="token">   </span><span class="token">setContent </span><span class="token">{
</span></span><span class="line"><span class="token">       </span><span class="token">InfinumComposeAppTheme </span><span class="token">{
</span></span><span class="line"><span class="token">           </span><span class="token">InfinumContent</span><span class="token">()
</span></span><span class="line"><span class="token">       }
</span></span><span class="line"><span class="token">   }
</span></span><span class="line"><span class="token">}
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-240"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-238">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-239'
	>
	By calling <strong><code>InfinumComposeAppTheme</code></strong> before emitting content, we explicitly say that we want to use Material Design attributes from that custom composable function. It is similar to declaring an application theme inside in a regular view-based UI.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-243"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-241">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-242'
	>
	Finally, add color attributes to our <strong><code>InfinumContent</code></strong> composable function to get the effect:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-245"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #6f42c1;">@Composable</span><span class="token">
</span></span><span class="line"><span class="token">fun InfinumContent</span><span class="token">() {
</span></span><span class="line"><span class="token">Row</span><span class="token">(Modifier</span><span class="token">.background</span><span class="token">(MaterialTheme.colors.background)) {
</span></span><span class="line"><span class="token">       </span><span class="token">Image</span><span class="token">(
</span></span><span class="line"><span class="token">           </span><span class="token" style="color: #d73a49;">..</span><span class="token">.
</span></span><span class="line"><span class="token">           colorFilter </span><span class="token" style="color: #d73a49;">=</span><span class="token"> ColorFilter</span><span class="token">.tint</span><span class="token">(InfinumRed)
</span></span><span class="line"><span class="token">       )
</span></span><span class="line"><span class="token">       </span><span class="token">Text</span><span class="token">(
</span></span><span class="line"><span class="token">           </span><span class="token" style="color: #d73a49;">..</span><span class="token">.
</span></span><span class="line"><span class="token">           color </span><span class="token" style="color: #d73a49;">=</span><span class="token"> MaterialTheme.colors.onBackground
</span></span><span class="line"><span class="token">       )
</span></span><span class="line"><span class="token">   }
</span></span><span class="line"><span class="token">}
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-248"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-246"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-247">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2021/04/jetpack-compose-framework-4.webp"
					class="image__img block-media__image-img"
					alt=""
										height="971"
															width="1391"
										loading="lazy"
					 />
					</picture>

			<figcaption class="image__figcaption block-media__image-figcaption">
			Preview with custom colors for both Light and Dark Mode		</figcaption>
	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-251"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-249">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-250'
	>
	Typography in Jetpack Compose</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-254"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-252">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-253'
	>
	Regarding typography and how to show custom fonts, the best practice in Jetpack Compose is to put all typography-related stuff into the<strong><code>Type.kt</code></strong> file. Create the file and declare a custom font family as follows:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-256"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">val </span><span class="token">GTHaptik </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">FontFamily</span><span class="token">(
</span></span><span class="line"><span class="token">   </span><span class="token">Font</span><span class="token">(R.font.gt_haptik_regular, FontWeight.Normal),
</span></span><span class="line"><span class="token">   </span><span class="token">Font</span><span class="token">(R.font.gt_haptik_bold, FontWeight.Bold)
</span></span><span class="line"><span class="token">)
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-259"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-257">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-258'
	>
	Inside the same file, create the typography object with an upper font family. For simplicity, we only use the <strong><code>h2</code></strong> style:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-261"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">val </span><span class="token">Typography </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">Typography</span><span class="token">(
</span></span><span class="line"><span class="token">   h2 </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">TextStyle</span><span class="token">(
</span></span><span class="line"><span class="token">       fontFamily </span><span class="token" style="color: #d73a49;">=</span><span class="token"> GTHaptik,
</span></span><span class="line"><span class="token">       fontWeight </span><span class="token" style="color: #d73a49;">=</span><span class="token"> FontWeight.Bold,
</span></span><span class="line"><span class="token">       fontSize </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">60</span><span class="token">.sp,
</span></span><span class="line"><span class="token">       letterSpacing </span><span class="token" style="color: #d73a49;">=</span><span class="token"> (</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #005cc5;">0.5</span><span class="token">).sp
</span></span><span class="line"><span class="token">   )
</span></span><span class="line"><span class="token">)
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-264"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-262">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-263'
	>
	Inside the <strong><code>Theme.kt</code></strong> file, update <strong><code>InfinumComposeAppTheme</code></strong> with the previously declared typography attribute:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-266"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #6f42c1;">@Composable</span><span class="token">
</span></span><span class="line"><span class="token">fun InfinumComposeAppTheme</span><span class="token">(
</span></span><span class="line"><span class="token">   darkTheme</span><span class="token">: </span><span class="token" style="color: #6f42c1;">Boolean</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">isSystemInDarkTheme</span><span class="token">(),
</span></span><span class="line"><span class="token">   content</span><span class="token">: </span><span class="token" style="color: #6f42c1;">@Composable</span><span class="token"> () </span><span class="token" style="color: #d73a49;">-&gt;</span><span class="token"> Unit
</span></span><span class="line"><span class="token">) {
</span></span><span class="line"><span class="token">   </span><span class="token" style="color: #d73a49;">..</span><span class="token">.
</span></span><span class="line"><span class="token">   </span><span class="token">MaterialTheme</span><span class="token">(
</span></span><span class="line"><span class="token">       </span><span class="token" style="color: #d73a49;">..</span><span class="token">.
</span></span><span class="line"><span class="token">       typography </span><span class="token" style="color: #d73a49;">=</span><span class="token"> Typography
</span></span><span class="line"><span class="token">   )
</span></span><span class="line"><span class="token">}
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-269"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-267">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-268'
	>
	Inside <strong><code>InfinumContent</code></strong> add style to <strong><code>Text</code></strong> composable to get the effect:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-271"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #6f42c1;">@Composable</span><span class="token">
</span></span><span class="line"><span class="token">fun InfinumContent</span><span class="token">() {
</span></span><span class="line"><span class="token">       </span><span class="token" style="color: #d73a49;">..</span><span class="token">.
</span></span><span class="line"><span class="token">       </span><span class="token">Text</span><span class="token">(
</span></span><span class="line"><span class="token">           </span><span class="token" style="color: #d73a49;">..</span><span class="token">.
</span></span><span class="line"><span class="token">           style </span><span class="token" style="color: #d73a49;">=</span><span class="token"> MaterialTheme.typography.h2
</span></span><span class="line"><span class="token">       )
</span></span><span class="line"><span class="token">   }
</span></span><span class="line"><span class="token">}
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-274"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-272"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-273">
	<picture class="image__picture block-media__image-picture">
								
			<source
				srcset=https://infinum.com/uploads/2021/04/jetpack-compose-framework-5-1400x884.webp				media='(max-width: 699px)'
				type=image/webp								height="884"
												width="1400"
				 />
												<img
					src="https://infinum.com/uploads/2021/04/jetpack-compose-framework-5.webp"
					class="image__img block-media__image-img"
					alt=""
										height="946"
															width="1498"
										loading="lazy"
					 />
					</picture>

			<figcaption class="image__figcaption block-media__image-figcaption">
			Preview with custom typography for both Light and Dark Mode		</figcaption>
	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-277"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-275">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-276'
	>
	Shapes in Jetpack Compose</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-280"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-278">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-279'
	>
	With shape customization, we want our composable content to have rounded corners. To do that, the best practice is to create the <strong><code>Shape.kt</code></strong> file and define shapes for small, medium and large components as follows:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-282"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">val </span><span class="token">Shapes </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">Shapes</span><span class="token">(
</span></span><span class="line"><span class="token">   small </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">RoundedCornerShape</span><span class="token">(</span><span class="token" style="color: #005cc5;">4</span><span class="token">.dp),
</span></span><span class="line"><span class="token">   medium </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">RoundedCornerShape</span><span class="token">(</span><span class="token" style="color: #005cc5;">8</span><span class="token">.dp),
</span></span><span class="line"><span class="token">   large </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">RoundedCornerShape</span><span class="token">(</span><span class="token" style="color: #005cc5;">16</span><span class="token">.dp)
</span></span><span class="line"><span class="token">)
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-285"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-283">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-284'
	>
	Inside the <strong><code>Theme.kt</code></strong> file, update <strong><code>InfinumComposeAppTheme</code></strong> with previously defined shapes attribute:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-287"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #6f42c1;">@Composable</span><span class="token">
</span></span><span class="line"><span class="token">fun InfinumComposeAppTheme</span><span class="token">(
</span></span><span class="line"><span class="token">   darkTheme</span><span class="token">: </span><span class="token" style="color: #6f42c1;">Boolean</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">isSystemInDarkTheme</span><span class="token">(),
</span></span><span class="line"><span class="token">   content</span><span class="token">: </span><span class="token" style="color: #6f42c1;">@Composable</span><span class="token"> () </span><span class="token" style="color: #d73a49;">-&gt;</span><span class="token"> Unit
</span></span><span class="line"><span class="token">) {
</span></span><span class="line"><span class="token">   </span><span class="token" style="color: #d73a49;">..</span><span class="token">.
</span></span><span class="line"><span class="token">   </span><span class="token">MaterialTheme</span><span class="token">(
</span></span><span class="line"><span class="token">       </span><span class="token" style="color: #d73a49;">..</span><span class="token">.
</span></span><span class="line"><span class="token">       shapes </span><span class="token" style="color: #d73a49;">=</span><span class="token"> Shapes
</span></span><span class="line"><span class="token">   )
</span></span><span class="line"><span class="token">}
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-290"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-288">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-289'
	>
	Since shapes are used on the surface, not in the background, wrap <strong><code>Row</code></strong> composable inside the <strong><code>InfinumContent</code></strong> with <strong><code>Surface</code></strong> composable to get the effect:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-292"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #6f42c1;">@Composable</span><span class="token">
</span></span><span class="line"><span class="token">fun InfinumContent</span><span class="token">() {
</span></span><span class="line"><span class="token">   </span><span class="token">Surface</span><span class="token">(shape </span><span class="token" style="color: #d73a49;">=</span><span class="token"> MaterialTheme.shapes.large) {
</span></span><span class="line"><span class="token">       </span><span class="token">Row </span><span class="token">{
</span></span><span class="line"><span class="token">           </span><span class="token">Image</span><span class="token">(
</span></span><span class="line"><span class="token">               </span><span class="token" style="color: #d73a49;">..</span><span class="token">.
</span></span><span class="line"><span class="token">           )
</span></span><span class="line"><span class="token">           </span><span class="token">Text</span><span class="token">(
</span></span><span class="line"><span class="token">               </span><span class="token" style="color: #d73a49;">..</span><span class="token">.
</span></span><span class="line"><span class="token">            )
</span></span><span class="line"><span class="token">       }
</span></span><span class="line"><span class="token">     }
</span></span><span class="line"><span class="token">}
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-295"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-293"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-294">
	<picture class="image__picture block-media__image-picture">
								
			<source
				srcset=https://infinum.com/uploads/2021/04/jetpack-compose-framework-6-1400x959.webp				media='(max-width: 699px)'
				type=image/webp								height="959"
												width="1400"
				 />
												<img
					src="https://infinum.com/uploads/2021/04/jetpack-compose-framework-6.webp"
					class="image__img block-media__image-img"
					alt=""
										height="972"
															width="1419"
										loading="lazy"
					 />
					</picture>

			<figcaption class="image__figcaption block-media__image-figcaption">
			Preview with custom shapes for both Light and Dark Mode		</figcaption>
	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-298"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-296">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-297'
	>
	Ready to adopt? Jetpack Compose interoperability</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-301"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-299">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-300'
	>
	Jetpack Compose is interoperable with existing view-based UI. If you are building a new application from scratch, implementing a UI complete in Compose is the best option.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-304"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-302">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-303'
	>
	If you have an existing project and want to migrate to Jetpack Compose, it is a big step to migrate all at once. Instead, you can combine Compose with existing UI design implementation.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-307"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-305">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-306'
	>
	Compose in Android Views</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-310"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-308">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-309'
	>
	We already covered using Compose inside <strong><code>Activity</code></strong> in previous sections. To create an entire Compose-based UI, call <strong><code>setContent</code></strong> inside the <strong><code>onCreate</code></strong> method in <strong><code>Activity</code></strong> and pass whatever composable functions you like, like the following:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-312"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">override</span><span class="token"> </span><span class="token">fun onCreate</span><span class="token">(savedInstanceState</span><span class="token">: </span><span class="token" style="color: #6f42c1;">Bundle</span><span class="token">?</span><span class="token">) {
</span></span><span class="line"><span class="token">   </span><span class="token" style="color: #005cc5;">super</span><span class="token">.onCreate</span><span class="token">(savedInstanceState)
</span></span><span class="line"><span class="token">   </span><span class="token">setContent </span><span class="token">{
</span></span><span class="line"><span class="token">       </span><span class="token">val </span><span class="token">viewModel </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">viewModel</span><span class="token">(modelClass </span><span class="token" style="color: #d73a49;">=</span><span class="token"> MainViewModel</span><span class="token">::</span><span class="token" style="color: #6f42c1;">class</span><span class="token">.java)
</span></span><span class="line"><span class="token">       </span><span class="token">InfinumHome</span><span class="token">(viewModel)
</span></span><span class="line"><span class="token">   }
</span></span><span class="line"><span class="token">}
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-315"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-313">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-314'
	>
	When you want to use Compose functionalities in an existing <strong><code>Fragment</code></strong>, we need to add <strong><code>ComposeView</code></strong> inside the fragment layout and call <strong><code>setContent</code></strong> on that view. <strong><code>ComposeView</code></strong> is Android View that it is attached to <strong><code>LifecyleOwner</code></strong> like any other view.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-318"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-316">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-317'
	>
	Simply add <strong><code>ComposeView</code></strong> into XML layout:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-320"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">&lt;</span><span class="token">?xml version</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">1.0</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> encoding</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">utf-8</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">?</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">&lt;</span><span class="token">androidx.constraintlayout.widget.ConstraintLayout
</span></span><span class="line"><span class="token">   xmlns</span><span class="token">:</span><span class="token" style="color: #6f42c1;">android</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">http://schemas.android.com/apk/res/android</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">   xmlns</span><span class="token">:</span><span class="token" style="color: #6f42c1;">app</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">http://schemas.android.com/apk/res-auto</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">   android</span><span class="token">:</span><span class="token" style="color: #6f42c1;">id</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">@+id/container</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">   android</span><span class="token">:</span><span class="token" style="color: #6f42c1;">layout_width</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">match_parent</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">   android</span><span class="token">:</span><span class="token" style="color: #6f42c1;">layout_height</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">match_parent</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">   </span><span class="token" style="color: #d73a49;">&lt;</span><span class="token">androidx.compose.ui.platform.ComposeView
</span></span><span class="line"><span class="token">       android</span><span class="token">:</span><span class="token" style="color: #6f42c1;">id</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">@+id/composeView</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">       android</span><span class="token">:</span><span class="token" style="color: #6f42c1;">layout_width</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">0dp</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">       android</span><span class="token">:</span><span class="token" style="color: #6f42c1;">layout_height</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">0dp</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">       app</span><span class="token">:</span><span class="token" style="color: #6f42c1;">layout_constraintBottom_toBottomOf</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">parent</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">       app</span><span class="token">:</span><span class="token" style="color: #6f42c1;">layout_constraintEnd_toEndOf</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">parent</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">       app</span><span class="token">:</span><span class="token" style="color: #6f42c1;">layout_constraintStart_toStartOf</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">parent</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">       app</span><span class="token">:</span><span class="token" style="color: #6f42c1;">layout_constraintTop_toTopOf</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">parent</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> </span><span class="token" style="color: #d73a49;">/</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #d73a49;">/</span><span class="token">androidx.constraintlayout.widget.ConstraintLayout</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-323"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-321">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-322'
	>
	Inside the <strong><code>Fragment</code></strong> source code, inflate upper layout, find <strong><code>ComposeView</code></strong> and call <strong><code>setContent</code></strong> on it:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-325"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">override</span><span class="token"> </span><span class="token">fun onCreateView</span><span class="token">(
</span></span><span class="line"><span class="token">   inflater</span><span class="token">: </span><span class="token" style="color: #6f42c1;">LayoutInflater</span><span class="token">,
</span></span><span class="line"><span class="token">   container</span><span class="token">: </span><span class="token" style="color: #6f42c1;">ViewGroup</span><span class="token">?</span><span class="token">,
</span></span><span class="line"><span class="token">   savedInstanceState</span><span class="token">: </span><span class="token" style="color: #6f42c1;">Bundle</span><span class="token">?
</span></span><span class="line"><span class="token">)</span><span class="token">: </span><span class="token" style="color: #6f42c1;">View</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> inflater</span><span class="token">.inflate</span><span class="token">(
</span></span><span class="line"><span class="token">   R.layout.fragment_main, container, </span><span class="token" style="color: #005cc5;">false</span><span class="token">
</span></span><span class="line"><span class="token">)</span><span class="token">.apply </span><span class="token">{
</span></span><span class="line"><span class="token">   </span><span class="token">findViewById</span><span class="token">&lt;</span><span class="token" style="color: #6f42c1;">ComposeView</span><span class="token">&gt;</span><span class="token">(R.id.composeView)</span><span class="token">.setContent </span><span class="token">{
</span></span><span class="line"><span class="token">       </span><span class="token">val </span><span class="token">viewModel </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">viewModel</span><span class="token">(modelClass </span><span class="token" style="color: #d73a49;">=</span><span class="token"> MainViewModel</span><span class="token">::</span><span class="token" style="color: #6f42c1;">class</span><span class="token">.java)
</span></span><span class="line"><span class="token">       </span><span class="token">InfinumHome</span><span class="token">(viewModel)
</span></span><span class="line"><span class="token">   }
</span></span><span class="line"><span class="token">}
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-328"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-326">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-327'
	>
	If you want to build the whole <strong><code>Fragment</code></strong> screen into Compose, you can directly pass <strong><code>ComposeView</code></strong> without needed for XML at all:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-330"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">override</span><span class="token"> </span><span class="token">fun onCreateView</span><span class="token">(
</span></span><span class="line"><span class="token">   inflater</span><span class="token">: </span><span class="token" style="color: #6f42c1;">LayoutInflater</span><span class="token">,
</span></span><span class="line"><span class="token">   container</span><span class="token">: </span><span class="token" style="color: #6f42c1;">ViewGroup</span><span class="token">?</span><span class="token">,
</span></span><span class="line"><span class="token">   savedInstanceState</span><span class="token">: </span><span class="token" style="color: #6f42c1;">Bundle</span><span class="token">?
</span></span><span class="line"><span class="token">)</span><span class="token">: </span><span class="token" style="color: #6f42c1;">View</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">ComposeView</span><span class="token">(</span><span class="token">requireContext</span><span class="token">())</span><span class="token">.apply </span><span class="token">{
</span></span><span class="line"><span class="token">   </span><span class="token">setContent </span><span class="token">{
</span></span><span class="line"><span class="token">       </span><span class="token">val </span><span class="token">viewModel </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">viewModel</span><span class="token">(modelClass </span><span class="token" style="color: #d73a49;">=</span><span class="token"> MainViewModel</span><span class="token">::</span><span class="token" style="color: #6f42c1;">class</span><span class="token">.java)
</span></span><span class="line"><span class="token">       </span><span class="token">InfinumHome</span><span class="token">(viewModel)
</span></span><span class="line"><span class="token">   }
</span></span><span class="line"><span class="token">}
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-333"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-331">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-332'
	>
	Android Views in Compose</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-336"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-334">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-335'
	>
	Including existing Android Views in Jetpack Compose UI is also possible. This approach is handy when some components are unavailable in Compose like <strong><code>MapView</code></strong> or <strong><code>AdView</code></strong>. This approach is also applicable to already created custom views.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-339"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-337">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-338'
	>
	Implement the mentioned <strong><code>MapView</code></strong> in the Compose world like this:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-341"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-kotlin github-light" data-language="kotlin" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #6f42c1;">@Composable</span><span class="token">
</span></span><span class="line"><span class="token">fun ComposeMapView</span><span class="token">() {
</span></span><span class="line"><span class="token">   </span><span class="token">var </span><span class="token">googleMap</span><span class="token">: </span><span class="token" style="color: #6f42c1;">GoogleMap</span><span class="token">? </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">null</span><span class="token">
</span></span><span class="line"><span class="token">   </span><span class="token">AndroidView</span><span class="token">(
</span></span><span class="line"><span class="token">       modifier </span><span class="token" style="color: #d73a49;">=</span><span class="token"> Modifier</span><span class="token">.fillMaxSize</span><span class="token">(),
</span></span><span class="line"><span class="token">       factory </span><span class="token" style="color: #d73a49;">=</span><span class="token"> { context </span><span class="token" style="color: #d73a49;">-&gt;</span><span class="token">
</span></span><span class="line"><span class="token">           </span><span class="token">MapView</span><span class="token">(context)</span><span class="token">.apply </span><span class="token">{
</span></span><span class="line"><span class="token">               MapsInitializer</span><span class="token">.initialize</span><span class="token">(context)
</span></span><span class="line"><span class="token">               googleMap </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">awaitMap</span><span class="token">()
</span></span><span class="line"><span class="token">           }
</span></span><span class="line"><span class="token">       },
</span></span><span class="line"><span class="token">       update </span><span class="token" style="color: #d73a49;">=</span><span class="token"> { mapView </span><span class="token" style="color: #d73a49;">-&gt;</span><span class="token"> </span><span class="token" style="color: #6a737d;">/*</span><span class="token" style="color: #6a737d;"> do something with the MapView </span><span class="token" style="color: #6a737d;">*/</span><span class="token"> }
</span></span><span class="line"><span class="token">   )
</span></span><span class="line"><span class="token">}
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-344"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-342">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-343'
	>
	<strong><code>AndroidView</code></strong> is a composable function that shows existing Android components inside Compose UI. It took a modifier parameter for defining view attributes, factory function that will return the declared component (in the upper scenario MapView), and update the function invoked when the view is inflated. Showing <strong><code>MapView</code></strong> inside Compose UI is easy peasy.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-347"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-345">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-346'
	>
	Dig deeper into Jetpack Compose</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-350"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-348">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-349'
	>
	This article covered the declarative approach used by Compose, how to get started with Compose project, and how to create basic layouts. We also reviewed theming and how easily we can style our components and use a color palette depending on Light or Dark Mode. Finally, we explored Jetpack Compose interoperability and explained how to switch between regular view-based UI to Compose and vice versa.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-353"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-351">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-352'
	>
	A sequel to this blog post is in the making as we speak, in which we will dig deeper into Jetpack Compose, covering some more advanced aspects such as state management and composition, how to perform animations and make our UI more alive, as well as how to test our Compose layout. Stay tuned!</p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/jetpack-compose-framework/">Android, Meet Jetpack Compose!</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
		
	</channel>
</rss>