{"id":33525,"date":"2025-11-04T00:31:20","date_gmt":"2025-11-03T21:31:20","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/android-uinin-lego-tuglalariyla-tanisin-compose-ile-baslangic-kilavuzu\/"},"modified":"2025-11-04T00:31:20","modified_gmt":"2025-11-03T21:31:20","slug":"android-uinin-lego-tuglalariyla-tanisin-compose-ile-baslangic-kilavuzu","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/android-uinin-lego-tuglalariyla-tanisin-compose-ile-baslangic-kilavuzu\/","title":{"rendered":"Android UI&#8217;nin Lego Tu\u011flalar\u0131yla Tan\u0131\u015f\u0131n: Compose ile Ba\u015flang\u0131\u00e7 K\u0131lavuzu"},"content":{"rendered":"<p><body><\/p>\n<p>Geleneksel Android UI geli\u015ftirme y\u00f6ntemleri karma\u015f\u0131k XML d\u00fczenleri ve hantal kod yap\u0131lar\u0131 nedeniyle sizi zorluyor mu? Modern Android uygulamalar\u0131 in\u015fa etmek i\u00e7in Lego tu\u011flalar\u0131 gibi yeniden kullan\u0131labilir bile\u015fenlerle, h\u0131zl\u0131 ve sezgisel bir yakla\u015f\u0131m sunan Jetpack Compose ile tan\u0131\u015f\u0131n. Bu k\u0131lavuz, deklaratif UI&#8217;\u0131n g\u00fcc\u00fcn\u00fc ke\u015ffederek Android geli\u015ftirme s\u00fcrecinizi d\u00f6n\u00fc\u015ft\u00fcrmenize yard\u0131mc\u0131 olacak.<\/p>\n<p>Y\u0131llarca Android kullan\u0131c\u0131 aray\u00fczleri, XML tabanl\u0131 d\u00fczen dosyalar\u0131 ve bu d\u00fczenleri kod taraf\u0131nda manip\u00fcle eden Java\/Kotlin kodlar\u0131 ile geli\u015ftirildi. Bu &#8220;imperatif&#8221; yakla\u015f\u0131m, \u00f6zellikle karma\u015f\u0131k ekranlarda veya dinamik i\u00e7eriklerde geli\u015ftirme s\u00fcrecini zorla\u015ft\u0131rabiliyordu. \u00d6rne\u011fin, bir liste \u00f6\u011fesinin rengini de\u011fi\u015ftirmek istedi\u011finizde, \u00f6nce XML&#8217;de tan\u0131mlanan g\u00f6r\u00fcn\u00fcm\u00fc bulman\u0131z, sonra kodda ona referans alarak \u00f6zelli\u011fini g\u00fcncellemeniz gerekirdi. Bu durum, \u00f6zellikle uygulaman\u0131z\u0131n boyutu ve karma\u015f\u0131kl\u0131\u011f\u0131 artt\u0131k\u00e7a, y\u00f6netimi zorla\u015fan, hataya a\u00e7\u0131k ve okunabilirli\u011fi d\u00fc\u015f\u00fck bir kod taban\u0131na yol a\u00e7abiliyordu.<\/p>\n<p>Dahas\u0131, geleneksel sistemde kullan\u0131c\u0131 aray\u00fcz\u00fc ve uygulaman\u0131n mant\u0131\u011f\u0131 aras\u0131nda s\u0131k\u0131 bir ba\u011f\u0131ml\u0131l\u0131k olu\u015fabiliyordu. Bu da bir bile\u015fenin UI&#8217;\u0131n\u0131 de\u011fi\u015ftirdi\u011finizde, ilgili i\u015f mant\u0131\u011f\u0131n\u0131 da etkileyebilece\u011fi anlam\u0131na geliyordu. Geli\u015ftiriciler olarak, daha az kod yazarak, daha okunabilir, daha s\u00fcrd\u00fcr\u00fclebilir ve daha h\u0131zl\u0131 kullan\u0131c\u0131 aray\u00fczleri olu\u015fturabilmenin yollar\u0131n\u0131 ar\u0131yorduk. Bu aray\u0131\u015f\u0131n do\u011fal bir sonucu olarak Jetpack Compose, deklaratif programlama paradigmas\u0131n\u0131 Android d\u00fcnyas\u0131na getirerek ezber bozan bir \u00e7\u00f6z\u00fcm sundu. Geleneksel yakla\u015f\u0131mlar\u0131n aksine, Compose ile &#8220;nas\u0131l yap\u0131laca\u011f\u0131n\u0131&#8221; de\u011fil, &#8220;neyin g\u00f6sterilece\u011fini&#8221; tan\u0131mlars\u0131n\u0131z. Bu paradigma de\u011fi\u015fikli\u011fi, geli\u015ftirme h\u0131z\u0131m\u0131z\u0131 art\u0131r\u0131rken ayn\u0131 zamanda kod kalitemizi de \u00f6nemli \u00f6l\u00e7\u00fcde y\u00fckseltir. \u0130lk bak\u0131\u015fta karma\u015f\u0131k gibi g\u00f6r\u00fcnse de, Compose&#8217;un temel prensiplerini anlad\u0131\u011f\u0131n\u0131zda, Android UI geli\u015ftirmenin ne kadar keyifli ve verimli olabilece\u011fine \u015fa\u015f\u0131racaks\u0131n\u0131z. \u0130\u015fte bu makale, sizi bu yeni d\u00fcnyaya ad\u0131m ad\u0131m ta\u015f\u0131yacak ve Android UI&#8217;\u0131n Lego tu\u011flalar\u0131yla nas\u0131l harikalar yaratabilece\u011finizi g\u00f6sterecek.<\/p>\n<h2>Compose&#8217;un Temelleri: Lego Tu\u011flalar\u0131 Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h2>\n<p>Jetpack Compose, Android kullan\u0131c\u0131 aray\u00fczleri olu\u015fturmak i\u00e7in modern, deklaratif bir yakla\u015f\u0131m sunar. Geleneksel XML tabanl\u0131 sistemin aksine, Compose tamamen Kotlin ile yaz\u0131l\u0131r ve UI&#8217;\u0131 programatik olarak tan\u0131mlaman\u0131za olanak tan\u0131r. Peki, bu &#8220;Lego tu\u011flalar\u0131&#8221; benzetmesi ne anlama geliyor ve Compose&#8217;u bu kadar farkl\u0131 k\u0131lan nedir?<\/p>\n<h3>Deklaratif vs. \u0130mperatif UI: Paradigmalar\u0131 Anlamak<\/h3>\n<p>Geleneksel Android UI geli\u015ftirme (XML), &#8220;imperatif&#8221; bir yakla\u015f\u0131ma \u00f6rnektir. Burada, UI bile\u015fenlerini (View&#8217;lar) teker teker olu\u015fturur, \u00f6zelliklerini ayarlar ve durumlar\u0131 de\u011fi\u015ftik\u00e7e bu bile\u015fenleri manuel olarak g\u00fcncellersiniz. Yani, uygulaman\u0131z\u0131n ekran\u0131nda bir metin g\u00f6r\u00fcnt\u00fclemek istedi\u011finizde, bir <code>TextView<\/code> olu\u015fturur, metnini ayarlar ve onu bir <code>ViewGroup<\/code>&#8216;a eklersiniz. Metin de\u011fi\u015fti\u011finde ise, yine o <code>TextView<\/code>&#8216;u bulup <code>setText()<\/code> metodunu \u00e7a\u011f\u0131r\u0131rs\u0131n\u0131z. Bu, &#8220;nas\u0131l yap\u0131laca\u011f\u0131n\u0131&#8221; ad\u0131m ad\u0131m anlatan bir tariftir.<\/p>\n<p>Compose ise &#8220;deklaratif&#8221; bir yakla\u015f\u0131ma sahiptir. Siz sadece ekran\u0131n mevcut duruma g\u00f6re &#8220;nas\u0131l g\u00f6r\u00fcnmesi gerekti\u011fini&#8221; tan\u0131mlars\u0131n\u0131z. Uygulaman\u0131n verileri de\u011fi\u015fti\u011finde, Compose UI&#8217;\u0131 otomatik olarak yeniden \u00e7izerek ekran\u0131 g\u00fcncel duruma getirir. Yani, bir metin g\u00f6r\u00fcnt\u00fclemek i\u00e7in <code>Text(\"Merhaba D\u00fcnya\")<\/code> dersiniz. Metin de\u011fi\u015fti\u011finde, <code>Text<\/code> bile\u015fenine yeni metni ge\u00e7irirsiniz ve Compose, metnin g\u00fcncellenmesi gereken k\u0131s\u0131mlar\u0131 ak\u0131ll\u0131ca yeniden olu\u015fturur. Bu, &#8220;ne g\u00f6stermeliyim&#8221; sorusuna cevap veren bir tablodur. Bu temel farkl\u0131l\u0131k, kodun \u00e7ok daha basit, okunabilir ve bak\u0131m\u0131 kolay olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Composables: UI&#8217;\u0131n Temel Yap\u0131 Ta\u015flar\u0131<\/h3>\n<p>Compose&#8217;daki her UI \u00f6\u011fesi bir &#8220;Composable&#8221; fonksiyondur. Bir buton, bir metin alan\u0131, bir resim veya hatta t\u00fcm bir ekran; hepsi birer Composable&#8217;d\u0131r. <code>@Composable<\/code> notasyonu ile i\u015faretlenen bu fonksiyonlar, di\u011fer Composable&#8217;lar\u0131 \u00e7a\u011f\u0131rarak daha karma\u015f\u0131k UI&#8217;lar olu\u015fturabilir. T\u0131pk\u0131 Lego tu\u011flalar\u0131n\u0131 bir araya getirerek farkl\u0131 yap\u0131lar olu\u015fturman\u0131z gibi, k\u00fc\u00e7\u00fck Composable fonksiyonlar\u0131 birle\u015ftirerek b\u00fcy\u00fck ve karma\u015f\u0131k kullan\u0131c\u0131 aray\u00fczleri in\u015fa edersiniz.<\/p>\n<pre><code>\n@Composable\nfun Greeting(name: String) {\n    Text(text = \"Merhaba, $name!\")\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte <code>Greeting<\/code> bir Composable fonksiyondur. \u0130\u00e7inde ba\u015fka bir Composable olan <code>Text<\/code>'i \u00e7a\u011f\u0131r\u0131r. Bu fonksiyonlar, herhangi bir de\u011fer d\u00f6nd\u00fcrmez; bunun yerine, ekran\u0131n bir b\u00f6l\u00fcm\u00fcn\u00fc tan\u0131mlarlar. Compose \u00e7al\u0131\u015fma zaman\u0131, bu Composable'lar\u0131 \u00e7al\u0131\u015ft\u0131rarak ekran\u0131n neye benzemesi gerekti\u011fini anlar ve bunu en verimli \u015fekilde i\u015fler.<\/p>\n<h3>Durum Y\u00f6netimi ve Recomposition<\/h3>\n<p>Compose'un sihirli k\u0131sm\u0131, uygulaman\u0131n \"durumu\" (\u00f6rne\u011fin, bir sayac\u0131n mevcut de\u011feri, bir giri\u015f alan\u0131ndaki metin) de\u011fi\u015fti\u011finde, UI'\u0131n otomatik olarak g\u00fcncellenmesidir. Bu s\u00fcrece \"recomposition\" denir. Geleneksel sistemde manuel olarak <code>findViewById<\/code> ve <code>setText<\/code> gibi i\u015flemlerle yapt\u0131\u011f\u0131m\u0131z g\u00fcncellemeleri, Compose bizim i\u00e7in otomatize eder. Bunu sa\u011flamak i\u00e7in, Compose'da <code>remember<\/code> ve <code>mutableStateOf<\/code> gibi ara\u00e7lar kullan\u0131l\u0131r. Bir Composable'\u0131n durumunu hat\u0131rlamas\u0131n\u0131 ve bu durum de\u011fi\u015fti\u011finde UI'\u0131 yeniden \u00e7izmesini sa\u011flarlar. \u00d6rne\u011fin, bir butona her bas\u0131ld\u0131\u011f\u0131nda artan bir sayac\u0131 d\u00fc\u015f\u00fcn\u00fcn. Sayac\u0131n de\u011feri bir durum olarak tutulur ve bu durum de\u011fi\u015fti\u011finde, ilgili <code>Text<\/code> Composable'\u0131 otomatik olarak g\u00fcncellenir. Bu, geli\u015ftiricinin UI g\u00fcncellemeleri hakk\u0131nda endi\u015felenmek yerine, yaln\u0131zca uygulaman\u0131n mant\u0131\u011f\u0131na odaklanmas\u0131na olanak tan\u0131r, bu da hatalar\u0131 azalt\u0131r ve geli\u015ftirme h\u0131z\u0131n\u0131 art\u0131r\u0131r. Bu kavramlar, Compose ile etkile\u015fimli ve dinamik kullan\u0131c\u0131 aray\u00fczleri olu\u015fturman\u0131n temelini olu\u015fturur ve ilerleyen b\u00f6l\u00fcmlerde daha detayl\u0131 inceleyece\u011fiz.<\/p>\n<h2>\u0130lk Lego Tu\u011flalar\u0131n\u0131z\u0131 Olu\u015fturun: Basit Bir Compose Uygulamas\u0131<\/h2>\n<p>Jetpack Compose ile Android UI geli\u015ftirme yolculu\u011funuza ba\u015flarken, ilk ad\u0131m olarak temel bile\u015fenleri ve bunlar\u0131n nas\u0131l bir araya getirilece\u011fini anlamak \u00f6nemlidir. T\u0131pk\u0131 Lego setini a\u00e7\u0131p ilk basit yap\u0131lar\u0131 birle\u015ftirmek gibi, Compose'da da k\u00fc\u00e7\u00fck, temel Composable'lardan ba\u015flayarak daha karma\u015f\u0131k yap\u0131lar olu\u015fturabilirsiniz.<\/p>\n<h3>Compose Projesi Olu\u015fturma ve \u0130lk Composable'\u0131n\u0131z<\/h3>\n<p>Android Studio'da yeni bir proje ba\u015flatt\u0131\u011f\u0131n\u0131zda, \"Empty Activity\" \u015fablonlar\u0131ndan \"Empty Activity (Compose)\" se\u00e7ene\u011fini i\u015faretleyerek do\u011frudan Compose destekli bir proje olu\u015fturabilirsiniz. Bu, gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve temel bir <code>MainActivity.kt<\/code> dosyas\u0131n\u0131 otomatik olarak kurar. Varsay\u0131lan olarak, uygulaman\u0131zda <code>Greeting<\/code> ad\u0131nda basit bir Composable fonksiyonu ve bunun \u00f6nizlemesini g\u00f6steren bir <code>DefaultPreview<\/code> fonksiyonu olacakt\u0131r.<\/p>\n<p>Bir Composable fonksiyonu, <code>@Composable<\/code> anotasyonu ile i\u015faretlenir ve genellikle UI'\u0131n belirli bir b\u00f6l\u00fcm\u00fcn\u00fc tan\u0131mlar. \u00d6rne\u011fin, bir \"Merhaba D\u00fcnya\" mesaj\u0131 g\u00f6stermek i\u00e7in en temel Composable olan <code>Text<\/code>'i kullan\u0131r\u0131z. \u0130\u015fte size basit bir ba\u015flang\u0131\u00e7:<\/p>\n<pre><code>\npackage com.example.myfirstcomposeapp\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Surface\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.tooling.preview.Preview\nimport com.example.myfirstcomposeapp.ui.theme.MyFirstComposeAppTheme\n\nclass MainActivity : ComponentActivity() {\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContent {\n            MyFirstComposeAppTheme {\n                \/\/ A surface container using the 'background' color from the theme\n                Surface(\n                    modifier = Modifier.fillMaxSize(),\n                    color = MaterialTheme.colorScheme.background\n                ) {\n                    Greeting(\"Android\") \/\/ Kendi Composable'\u0131m\u0131z\u0131 \u00e7a\u011f\u0131rd\u0131k\n                }\n            }\n        }\n    }\n}\n\n@Composable\nfun Greeting(name: String, modifier: Modifier = Modifier) {\n    Text(\n        text = \"Merhaba, $name!\",\n        modifier = modifier\n    )\n}\n\n@Preview(showBackground = true)\n@Composable\nfun GreetingPreview() {\n    MyFirstComposeAppTheme {\n        Greeting(\"Android\")\n    }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki kodda, <code>Greeting<\/code> ad\u0131nda bir Composable fonksiyonu tan\u0131mlad\u0131k. Bu fonksiyon, parametre olarak ald\u0131\u011f\u0131 <code>name<\/code> de\u011ferini kullanarak ekranda \"Merhaba, [name]!\" yazan bir metin g\u00f6sterir. <code>Text<\/code> Composable'\u0131, bir metni g\u00f6r\u00fcnt\u00fclemek i\u00e7in en temel bile\u015fendir. <code>Modifier<\/code> ise, Composable'lar\u0131n boyutunu, konumunu, rengini ve di\u011fer g\u00f6rsel \u00f6zelliklerini ayarlamak i\u00e7in kullan\u0131lan g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. Bu \u00f6rnekte <code>modifier = modifier<\/code> diyerek gelen <code>modifier<\/code>'\u0131 <code>Text<\/code>'e ilettik. <code>Modifier<\/code> zincirlenebilir bir yap\u0131d\u0131r ve birden fazla \u00f6zelli\u011fi bir araya getirmenizi sa\u011flar, b\u00f6ylece daha karma\u015f\u0131k g\u00f6rsel ayarlamalar yapabilirsiniz. \u00d6rne\u011fin, <code>Modifier.padding(16.dp)<\/code> ile bile\u015fene i\u00e7 bo\u015fluk ekleyebilirsiniz.<\/p>\n<h3>Temel D\u00fczen Composables: Column, Row ve Box<\/h3>\n<p>Ger\u00e7ek uygulamalar sadece tek bir metin bile\u015feninden ibaret de\u011fildir; genellikle birden fazla bile\u015feni belirli bir d\u00fczende yan yana veya alt alta yerle\u015ftirmeniz gerekir. Compose, bu d\u00fczen ihtiya\u00e7lar\u0131 i\u00e7in <code>Column<\/code>, <code>Row<\/code> ve <code>Box<\/code> gibi g\u00fc\u00e7l\u00fc Composable'lar sunar:<\/p>\n<ul>\n<li><code>Column<\/code>: \u0130\u00e7indeki Composable'lar\u0131 dikey olarak, yani alt alta s\u0131ralar. T\u0131pk\u0131 bir s\u00fctun gibi.<\/li>\n<li><code>Row<\/code>: \u0130\u00e7indeki Composable'lar\u0131 yatay olarak, yani yan yana s\u0131ralar. T\u0131pk\u0131 bir sat\u0131r gibi.<\/li>\n<li><code>Box<\/code>: \u0130\u00e7indeki Composable'lar\u0131 \u00fcst \u00fcste bindirir. Bu, bir resmin \u00fczerine metin yazmak veya UI \u00f6\u011felerini \u00fcst \u00fcste hizalamak i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/li>\n<\/ul>\n<pre><code>\n@Composable\nfun SimpleLayoutExample() {\n    Column(\n        modifier = Modifier.fillMaxSize(), \/\/ T\u00fcm ekran\u0131 kapla\n        verticalArrangement = Arrangement.Center, \/\/ Dikeyde ortala\n        horizontalAlignment = Alignment.CenterHorizontally \/\/ Yatayda ortala\n    ) {\n        Text(\"Birinci Metin\", modifier = Modifier.padding(bottom = 8.dp))\n        Button(onClick = { \/* Buton t\u0131klama eylemi *\/ }) {\n            Text(\"Buton\")\n        }\n        Row(\n            modifier = Modifier.padding(top = 16.dp),\n            horizontalArrangement = Arrangement.SpaceAround,\n            verticalAlignment = Alignment.CenterVertically\n        ) {\n            Text(\"Sol\", modifier = Modifier.weight(1f)) \/\/ A\u011f\u0131rl\u0131k vererek e\u015fit da\u011f\u0131l\u0131m\n            Text(\"Sa\u011f\", modifier = Modifier.weight(1f))\n        }\n    }\n}\n\n@Preview(showBackground = true)\n@Composable\nfun SimpleLayoutExamplePreview() {\n    MyFirstComposeAppTheme {\n        SimpleLayoutExample()\n    }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, bir <code>Column<\/code> i\u00e7ine <code>Text<\/code>, <code>Button<\/code> ve <code>Row<\/code> yerle\u015ftirdik. <code>Column<\/code> ve <code>Row<\/code>'a uygulad\u0131\u011f\u0131m\u0131z <code>modifier<\/code>'lar ve <code>Arrangement<\/code> ile <code>Alignment<\/code> \u00f6zellikleri, i\u00e7lerindeki \u00f6\u011felerin nas\u0131l konumlanaca\u011f\u0131n\u0131 belirler. \u00d6rne\u011fin, <code>verticalArrangement = Arrangement.Center<\/code> ile dikeyde ortalama yaparken, <code>horizontalAlignment = Alignment.CenterHorizontally<\/code> ile yatayda ortalama sa\u011flad\u0131k. <code>Row<\/code> i\u00e7indeki <code>Text<\/code> bile\u015fenlerine <code>Modifier.weight(1f)<\/code> uygulayarak, yatayda e\u015fit yer kaplamalar\u0131n\u0131 sa\u011flad\u0131k. Bu Lego tu\u011flalar\u0131n\u0131 kullanarak, istedi\u011finiz d\u00fczeni \u00e7ok daha esnek ve okunabilir bir \u015fekilde in\u015fa edebilirsiniz. Her bir Composable, kendi ba\u015f\u0131na bir sorumlulu\u011fu \u00fcstlenir ve di\u011ferleriyle birle\u015ferek daha b\u00fcy\u00fck bir yap\u0131y\u0131 olu\u015fturur.<\/p>\n<h2>Etkile\u015fimli Deneyimler: Compose ile Durum Y\u00f6netimi ve Olaylar<\/h2>\n<p>Kullan\u0131c\u0131 aray\u00fczleri sadece statik i\u00e7erik g\u00f6stermekle kalmaz, ayn\u0131 zamanda kullan\u0131c\u0131yla etkile\u015fime girmelidir. Bir butona t\u0131kland\u0131\u011f\u0131nda bir eylem ger\u00e7ekle\u015ftirmek, bir metin kutusuna girilen veriyi i\u015flemek veya bir onay kutusunun durumunu de\u011fi\u015ftirmek gibi senaryolar, durum y\u00f6netimi ve olay dinleme mekanizmalar\u0131n\u0131 gerektirir. Compose'da bu kavramlar, deklaratif do\u011fas\u0131na uygun olarak geleneksel y\u00f6ntemlerden \u00e7ok daha sezgisel bir \u015fekilde ele al\u0131n\u0131r.<\/p>\n<h3>Compose'da Durum Nedir ve Neden \u00d6nemlidir?<\/h3>\n<p>Uygulaman\u0131z\u0131n \"durumu\", zamanla de\u011fi\u015febilecek herhangi bir veridir. Bir sayac\u0131n mevcut de\u011feri, bir kullan\u0131c\u0131n\u0131n giri\u015f alan\u0131na yazd\u0131\u011f\u0131 metin, bir sunucudan al\u0131nan veriler veya bir UI \u00f6\u011fesinin (\u00f6rne\u011fin bir onay kutusunun) se\u00e7ili olup olmamas\u0131 gibi bilgiler uygulaman\u0131z\u0131n durumunu olu\u015fturur. Compose, UI'\u0131 duruma g\u00f6re otomatik olarak yeniden \u00e7izdi\u011fi i\u00e7in, durumun do\u011fru y\u00f6netimi hayati \u00f6neme sahiptir. E\u011fer UI'\u0131n bir b\u00f6l\u00fcm\u00fc belirli bir duruma ba\u011fl\u0131ysa, o durum de\u011fi\u015fti\u011finde UI'\u0131n da g\u00fcncellenmesi gerekir.<\/p>\n<h3><code>remember<\/code> ve <code>mutableStateOf<\/code> ile Durumu Hat\u0131rlamak<\/h3>\n<p>Compose'da bir Composable'\u0131n kendi durumunu hat\u0131rlamas\u0131n\u0131 sa\u011flamak i\u00e7in <code>remember<\/code> ve <code>mutableStateOf<\/code> fonksiyonlar\u0131n\u0131 birlikte kullan\u0131r\u0131z. <code>remember<\/code>, bir Composable yeniden olu\u015fturuldu\u011funda (recomposition) bir de\u011feri korumas\u0131n\u0131 sa\u011flar. <code>mutableStateOf<\/code> ise, bu de\u011ferin de\u011fi\u015ftirilebilir (mutable) bir durum nesnesi olmas\u0131n\u0131 ve de\u011feri de\u011fi\u015fti\u011finde Compose'un ilgili Composable'lar\u0131 yeniden \u00e7izmesini tetikleyen bir g\u00f6zlemci mekanizmas\u0131 sunar. Bu ikili, bir Composable'\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca bir de\u011feri saklamas\u0131n\u0131 ve o de\u011fer de\u011fi\u015fti\u011finde UI'\u0131 otomatik olarak g\u00fcncellemesini sa\u011flar.<\/p>\n<pre><code>\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.material3.Button\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.tooling.preview.Preview\n\n@Composable\nfun CounterApp() {\n    \/\/ 'count' de\u011fi\u015fkeninin durumunu hat\u0131rlamas\u0131n\u0131 sa\u011fla.\n    \/\/ Ba\u015flang\u0131\u00e7 de\u011feri 0 olan bir MutableState olu\u015ftur.\n    var count by remember { mutableStateOf(0) }\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        verticalArrangement = Arrangement.Center,\n        horizontalAlignment = Alignment.CenterHorizontally\n    ) {\n        Text(text = \"Saya\u00e7: $count\")\n        Button(onClick = {\n            count++ \/\/ Durumu g\u00fcncelle. Bu, Text Composable'\u0131n\u0131 otomatik olarak yeniden \u00e7izer.\n        }) {\n            Text(\"Art\u0131r\")\n        }\n    }\n}\n\n@Preview(showBackground = true)\n@Composable\nfun CounterAppPreview() {\n    \/\/ Uygulama tema yap\u0131n\u0131z\u0131 buraya ekleyin\n    CounterApp()\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu <code>CounterApp<\/code> \u00f6rne\u011finde, <code>count<\/code> de\u011fi\u015fkeni <code>remember { mutableStateOf(0) }<\/code> ile tan\u0131mlanm\u0131\u015ft\u0131r. Bu, <code>count<\/code>'\u0131n ba\u015flang\u0131\u00e7ta 0 de\u011ferine sahip bir durum oldu\u011funu ve bu durum de\u011fi\u015fti\u011finde, onu kullanan Composable'lar\u0131n (burada <code>Text<\/code>) otomatik olarak yeniden \u00e7izilece\u011fini garanti eder. <code>count++<\/code> i\u015flemi, <code>count<\/code>'\u0131n de\u011ferini de\u011fi\u015ftirdi\u011finde, Compose bunu alg\u0131lar ve <code>Text<\/code> Composable'\u0131n\u0131 yeni de\u011ferle g\u00fcnceller. Geleneksel yakla\u015f\u0131mlarda <code>TextView.setText()<\/code> ile yapmam\u0131z gereken i\u015fi, Compose bizim i\u00e7in kendili\u011finden halleder.<\/p>\n<h3>Kullan\u0131c\u0131 Olaylar\u0131n\u0131 Y\u00f6netme<\/h3>\n<p>Kullan\u0131c\u0131 etkile\u015fimleri, Composable'lar\u0131n olay dinleyici (event listener) parametreleri arac\u0131l\u0131\u011f\u0131yla y\u00f6netilir. \u00d6rne\u011fin, <code>Button<\/code> Composable'\u0131 <code>onClick<\/code> ad\u0131nda bir lambda ifadesi (geri \u00e7a\u011f\u0131r\u0131m) al\u0131r. Bu lambda, buton t\u0131kland\u0131\u011f\u0131nda \u00e7al\u0131\u015facak kodu i\u00e7erir. Yukar\u0131daki <code>CounterApp<\/code> \u00f6rne\u011finde <code>Button<\/code>'\u0131n <code>onClick<\/code> parametresine <code>count++<\/code> kodunu ge\u00e7irdik. Bu, butona her t\u0131kland\u0131\u011f\u0131nda sayac\u0131n de\u011ferini art\u0131r\u0131r.<\/p>\n<aside class=\"case-study\">\n<h3>Vaka Analizi: E-ticaret Uygulamas\u0131nda \u00dcr\u00fcn Miktar Se\u00e7ici<\/h3>\n<p>Bir e-ticaret uygulamas\u0131nda, kullan\u0131c\u0131lar\u0131n al\u0131\u015fveri\u015f sepetine eklemek istedikleri \u00fcr\u00fcn miktar\u0131n\u0131 se\u00e7melerini sa\u011flayan bir bile\u015fen hayal edin. Bu bile\u015fen genellikle bir metin alan\u0131ndan ve \"Art\u0131r\" ile \"Azalt\" butonlar\u0131ndan olu\u015fur. Her buton t\u0131kland\u0131\u011f\u0131nda metin alan\u0131ndaki say\u0131 g\u00fcncellenir. Geleneksel XML'de bu, bir\u00e7ok <code>findViewById<\/code>, <code>setText<\/code> ve <code>setOnClickListener<\/code> \u00e7a\u011fr\u0131s\u0131 gerektirirken, Compose'da durumu <code>remember { mutableStateOf(...) }<\/code> ile y\u00f6neterek ve butonlar\u0131n <code>onClick<\/code> lambda'lar\u0131nda durumu g\u00fcncelleyerek \u00e7ok daha sade bir \u015fekilde yap\u0131labilir. B\u00f6ylece, miktar\u0131n de\u011fi\u015fti\u011fi anda UI'\u0131n an\u0131nda g\u00fcncellendi\u011fini g\u00f6r\u00fcr\u00fcz.<\/p>\n<pre><code>\n@Composable\nfun QuantitySelector() {\n    var quantity by remember { mutableStateOf(1) } \/\/ \u00dcr\u00fcn miktar\u0131 durumu\n\n    Row(\n        verticalAlignment = Alignment.CenterVertically,\n        horizontalArrangement = Arrangement.spacedBy(8.dp)\n    ) {\n        Button(onClick = { if (quantity > 1) quantity-- }) {\n            Text(\"-\")\n        }\n        Text(\"Adet: $quantity\")\n        Button(onClick = { quantity++ }) {\n            Text(\"+\")\n        }\n    }\n}\n        <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnek, Compose'un durum y\u00f6netimi ve olay dinleme mekanizmalar\u0131n\u0131 kullanarak etkile\u015fimli ve dinamik kullan\u0131c\u0131 aray\u00fczleri olu\u015fturman\u0131n ne kadar kolay ve verimli oldu\u011funu net bir \u015fekilde g\u00f6sterir. Uygulaman\u0131z\u0131n durumunu net bir \u015fekilde tan\u0131mlayarak ve bu duruma g\u00f6re UI'\u0131 otomatik olarak yeniden \u00e7izmesini Compose'a b\u0131rakarak, \u00e7ok daha az hata ile daha h\u0131zl\u0131 geli\u015ftirmeler yapabilirsiniz.<\/p>\n<\/aside>\n<h2>Geli\u015fmi\u015f Yap\u0131 Ta\u015flar\u0131: Daha Karma\u015f\u0131k Aray\u00fczler Olu\u015fturma<\/h2>\n<p>Temel Composable'lar ve durum y\u00f6netimiyle basit ekranlar olu\u015fturmay\u0131 \u00f6\u011frendik. Ancak modern uygulamalar genellikle uzun listeler, \u00f6zelle\u015ftirilmi\u015f kartlar ve markaya \u00f6zg\u00fc temalar gibi daha karma\u015f\u0131k UI \u00f6\u011feleri gerektirir. Jetpack Compose, bu geli\u015fmi\u015f ihtiya\u00e7lar\u0131 kar\u015f\u0131lamak i\u00e7in g\u00fc\u00e7l\u00fc ara\u00e7lar ve esneklik sunar. \u015eimdi, bu \"geli\u015fmi\u015f Lego tu\u011flalar\u0131n\u0131\" nas\u0131l kullanaca\u011f\u0131m\u0131za ve daha zengin kullan\u0131c\u0131 aray\u00fczleri nas\u0131l olu\u015fturaca\u011f\u0131m\u0131za bakal\u0131m.<\/p>\n<h3><code>LazyColumn<\/code> ve <code>LazyRow<\/code>: Performansl\u0131 Listeleme Bile\u015fenleri<\/h3>\n<p>Uygulamalar\u0131n b\u00fcy\u00fck \u00e7o\u011funlu\u011fu, kayd\u0131r\u0131labilir listeler (\u00f6rne\u011fin, e-posta listeleri, \u00fcr\u00fcn kataloglar\u0131 veya sosyal medya ak\u0131\u015flar\u0131) i\u00e7erir. Geleneksel <code>RecyclerView<\/code> karma\u015f\u0131k bir kurulum gerektirirken, Compose'daki <code>LazyColumn<\/code> ve <code>LazyRow<\/code> bu i\u015fi \u00e7ok daha basit ve verimli hale getirir. \"Lazy\" kelimesi, bu bile\u015fenlerin sadece o anda ekranda g\u00f6r\u00fcnen \u00f6\u011feleri olu\u015fturdu\u011fu ve i\u015fledi\u011fi anlam\u0131na gelir, bu da bellek ve performans a\u00e7\u0131s\u0131ndan b\u00fcy\u00fck bir avantaj sa\u011flar.<\/p>\n<pre><code>\nimport androidx.compose.foundation.layout.PaddingValues\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.foundation.lazy.items\nimport androidx.compose.material3.Card\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\n\ndata class Item(val id: Int, val name: String)\n\n@Composable\nfun ItemList(items: List<Item>) {\n    LazyColumn(\n        contentPadding = PaddingValues(16.dp), \/\/ Liste etraf\u0131nda bo\u015fluk\n        verticalArrangement = Arrangement.spacedBy(8.dp) \/\/ \u00d6\u011feler aras\u0131nda bo\u015fluk\n    ) {\n        items(items) { item ->\n            ItemCard(item)\n        }\n    }\n}\n\n@Composable\nfun ItemCard(item: Item) {\n    Card(\n        modifier = Modifier\n            .fillMaxWidth()\n            .padding(vertical = 4.dp)\n    ) {\n        Text(\n            text = \"\u00d6\u011fe #${item.id}: ${item.name}\",\n            modifier = Modifier.padding(16.dp)\n        )\n    }\n}\n\n@Preview(showBackground = true)\n@Composable\nfun ItemListPreview() {\n    val sampleItems = List(20) { i -> Item(i, \"\u00d6\u011fe Ad\u0131 ${i + 1}\") }\n    ItemList(sampleItems)\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>LazyColumn<\/code> kullanarak bir <code>Item<\/code> listesini g\u00f6r\u00fcnt\u00fcl\u00fcyoruz. <code>items<\/code> blo\u011fu, liste \u00f6\u011felerini Composable'lara d\u00f6n\u00fc\u015ft\u00fcr\u00fcr. Her bir <code>Item<\/code> i\u00e7in <code>ItemCard<\/code> ad\u0131nda \u00f6zel bir Composable olu\u015fturduk. <code>ItemCard<\/code>, bir <code>Card<\/code> bile\u015fenini kullanarak \u00f6\u011felerimize ho\u015f bir g\u00f6r\u00fcn\u00fcm kazand\u0131r\u0131yor. <code>contentPadding<\/code> ve <code>verticalArrangement<\/code> gibi <code>LazyColumn<\/code> parametreleri, liste i\u00e7eri\u011finin d\u00fczenini hassas bir \u015fekilde kontrol etmenizi sa\u011flar.<\/p>\n<h3>\u00d6zelle\u015ftirilmi\u015f Composable'lar Olu\u015fturma<\/h3>\n<p>Compose'un g\u00fcc\u00fc, k\u00fc\u00e7\u00fck, yeniden kullan\u0131labilir Composable'lar olu\u015fturup bunlar\u0131 bir araya getirme yetene\u011finden gelir. Kendi \u00f6zel \"Lego tu\u011flalar\u0131n\u0131z\u0131\" olu\u015fturarak, kodunuzu daha mod\u00fcler ve okunabilir hale getirebilirsiniz. Yukar\u0131daki <code>ItemCard<\/code> \u00f6rne\u011fi, \u00f6zel bir Composable'\u0131n basit bir \u00f6rne\u011fidir. Daha karma\u015f\u0131k senaryolarda, \u00f6rne\u011fin bir sosyal medya g\u00f6nderisi kart\u0131, bir \u00fcr\u00fcn detay g\u00f6r\u00fcn\u00fcm\u00fc veya bir navigasyon \u00e7ubu\u011fu gibi bile\u015fenleri kendi Composable'lar\u0131n\u0131z olarak tan\u0131mlayabilirsiniz. Bu, kod tekrar\u0131n\u0131 azalt\u0131r ve tasar\u0131m sisteminizin tutarl\u0131l\u0131\u011f\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Tema ve Stil Y\u00f6netimi<\/h3>\n<p>Bir uygulaman\u0131n g\u00f6r\u00fcn\u00fcm\u00fcn\u00fc ve hissini belirleyen renkler, yaz\u0131 tipleri, \u015fekiller ve di\u011fer stil \u00f6zellikleri, Compose'da <code>MaterialTheme<\/code> arac\u0131l\u0131\u011f\u0131yla merkezi olarak y\u00f6netilir. Android Studio'daki \"Empty Activity (Compose)\" \u015fablonu, projenizin <code>ui.theme<\/code> paketinde bir tema dosyas\u0131 olu\u015fturur. Burada uygulaman\u0131z\u0131n ana renklerini, yaz\u0131 tiplerini ve \u015fekillerini tan\u0131mlayabilirsiniz. T\u00fcm uygulaman\u0131zda bu tema kullan\u0131larak, renk \u015femas\u0131 veya yaz\u0131 tipi gibi global de\u011fi\u015fiklikleri tek bir yerden yapabilirsiniz.<\/p>\n<pre><code>\n\/\/ ui.theme\/Theme.kt dosyas\u0131nda\nprivate val DarkColorScheme = darkColorScheme(\n    primary = Purple80,\n    secondary = PurpleGrey80,\n    tertiary = Pink80\n)\n\nprivate val LightColorScheme = lightColorScheme(\n    primary = Purple40,\n    secondary = PurpleGrey40,\n    tertiary = Pink40\n)\n\n@Composable\nfun MyFirstComposeAppTheme(\n    darkTheme: Boolean = isSystemInDarkTheme(),\n    content: @Composable () -> Unit\n) {\n    val colors = if (darkTheme) {\n        DarkColorScheme\n    } else {\n        LightColorScheme\n    }\n\n    MaterialTheme(\n        colorScheme = colors,\n        typography = Typography, \/\/ \u00d6nceden tan\u0131mlanm\u0131\u015f yaz\u0131 tipleri\n        content = content\n    )\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Uygulaman\u0131zdaki herhangi bir Composable, <code>MaterialTheme.colorScheme.primary<\/code> veya <code>MaterialTheme.typography.bodyLarge<\/code> gibi de\u011ferlere eri\u015ferek temaya uygun stil bilgilerini alabilir. Bu, uygulaman\u0131z\u0131n markas\u0131na uygun, tutarl\u0131 bir UI olu\u015fturman\u0131za olanak tan\u0131r ve gelecekteki de\u011fi\u015fiklikleri \u00e7ok daha kolay hale getirir.<\/p>\n<aside class=\"expert-tip\">\n        Uzman \u0130pucu: Karma\u015f\u0131k listeler veya animasyonlar kullan\u0131rken performans sorunlar\u0131 ya\u015farsan\u0131z, <code>remember<\/code> veya <code>derivedStateOf<\/code> gibi ara\u00e7larla yeniden \u00e7izim (recomposition) miktar\u0131n\u0131 minimize etmeye \u00e7al\u0131\u015f\u0131n. Ayr\u0131ca, <code>Modifier<\/code> zincirlerini daha verimli kullanmak da performans\u0131 art\u0131rabilir. \u00d6rne\u011fin, ayn\u0131 \u00f6zellik i\u00e7in birden fazla <code>padding<\/code> yerine tek bir <code>padding<\/code> kullanmak daha iyidir.<br \/>\n    <\/aside>\n<p>Bu geli\u015fmi\u015f yap\u0131 ta\u015flar\u0131 ve teknikler, daha karma\u015f\u0131k ve profesyonel Android uygulamalar\u0131 olu\u015fturmak i\u00e7in Compose'un sundu\u011fu esnekli\u011fi ve g\u00fcc\u00fc ortaya koyar. Kendi \u00f6zel Composable'lar\u0131n\u0131z\u0131 olu\u015fturarak ve tema sistemini kullanarak, uygulaman\u0131z\u0131n tasar\u0131m\u0131n\u0131 ve i\u015flevselli\u011fini tamamen kontrol edebilirsiniz. Bu \"Lego tu\u011flalar\u0131n\u0131\" ustaca birle\u015ftirdi\u011finizde, hayal g\u00fcc\u00fcn\u00fczle s\u0131n\u0131rl\u0131, \u00e7arp\u0131c\u0131 kullan\u0131c\u0131 aray\u00fczleri yaratabilirsiniz.<\/p>\n<h2>Mobil Uyumluluk ve Duyarl\u0131 Tasar\u0131m: Farkl\u0131 Cihazlara Adaptasyon<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz Android ekosistemi, ak\u0131ll\u0131 telefonlardan tabletlere, katlanabilir cihazlardan TV'lere kadar geni\u015f bir cihaz yelpazesine sahiptir. Uygulaman\u0131z\u0131n bu farkl\u0131 ekran boyutlar\u0131na ve y\u00f6nlendirmelerine sorunsuz bir \u015fekilde uyum sa\u011flamas\u0131, ba\u015far\u0131l\u0131 bir kullan\u0131c\u0131 deneyimi i\u00e7in kritik \u00f6neme sahiptir. Jetpack Compose, geleneksel XML tabanl\u0131 yakla\u015f\u0131mlara g\u00f6re duyarl\u0131 (responsive) UI tasarlamay\u0131 \u00e7ok daha kolay ve sezgisel hale getirir.<\/p>\n<h3>Compose'un Duyarl\u0131 Tasar\u0131m Yakla\u015f\u0131m\u0131<\/h3>\n<p>Geleneksel olarak, farkl\u0131 ekran boyutlar\u0131 i\u00e7in ayr\u0131 XML d\u00fczenleri (<code>layout-sw600dp<\/code>, <code>layout-land<\/code> vb.) olu\u015fturmam\u0131z gerekirdi. Compose'da ise bu t\u00fcr karma\u015f\u0131k dosya yap\u0131lar\u0131na genellikle ihtiya\u00e7 duyulmaz. Bunun yerine, mevcut ekran boyutunu ve y\u00f6nlendirmeyi \u00e7al\u0131\u015fma zaman\u0131nda sorgulayarak UI'\u0131 dinamik olarak uyarlayabiliriz. Compose, \"modlay\u0131c\u0131lar\" (modifiers) ve ak\u0131ll\u0131 d\u00fczen Composables'lar\u0131 sayesinde bu esnekli\u011fi sa\u011flar.<\/p>\n<p>Compose'daki d\u00fczen Composables'lar\u0131 (<code>Column<\/code>, <code>Row<\/code>, <code>Box<\/code>) varsay\u0131lan olarak esnektir ve i\u00e7erdikleri i\u00e7eri\u011fe veya kendilerine verilen k\u0131s\u0131tlamalara g\u00f6re boyutlar\u0131n\u0131 ayarlarlar. <code>Modifier.fillMaxWidth()<\/code>, <code>Modifier.fillMaxHeight()<\/code>, <code>Modifier.weight()<\/code> gibi modlay\u0131c\u0131lar, bir bile\u015fenin ebeveynine g\u00f6re nas\u0131l davranaca\u011f\u0131n\u0131 belirleyerek duyarl\u0131 tasar\u0131ma do\u011frudan katk\u0131da bulunur. \u00d6rne\u011fin, bir <code>Row<\/code> i\u00e7indeki iki <code>Text<\/code> bile\u015fenine e\u015fit a\u011f\u0131rl\u0131k (<code>Modifier.weight(1f)<\/code>) vermek, ekran boyutu ne olursa olsun bu iki metnin yatayda e\u015fit yer kaplamas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Ekran Boyutuna G\u00f6re D\u00fczen De\u011fi\u015fikli\u011fi<\/h3>\n<p>Daha karma\u015f\u0131k duyarl\u0131 tasar\u0131mlar i\u00e7in, ekran\u0131n geni\u015fli\u011fini veya y\u00fcksekli\u011fini programatik olarak kontrol ederek farkl\u0131 d\u00fczenler olu\u015fturabiliriz. Bu, bir t\u00fcr \"Compose tabanl\u0131 media query\" olarak d\u00fc\u015f\u00fcn\u00fclebilir. <code>Configuration<\/code> s\u0131n\u0131f\u0131 ve <code>LocalConfiguration<\/code> CompositionLocal'\u0131, cihaz\u0131n mevcut yap\u0131land\u0131rma bilgilerine (ekran boyutu, y\u00f6nlendirme gibi) eri\u015fim sa\u011flar. Bu bilgilere dayanarak Composable'lar\u0131m\u0131z\u0131n davran\u0131\u015f\u0131n\u0131 de\u011fi\u015ftirebiliriz.<\/p>\n<pre><code>\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.platform.LocalConfiguration\nimport androidx.compose.ui.unit.dp\n\n@Composable\nfun ResponsiveLayoutExample() {\n    val configuration = LocalConfiguration.current\n    val screenWidthDp = configuration.screenWidthDp\n\n    \/\/ Tablet boyutuna yak\u0131n veya daha b\u00fcy\u00fckse (\u00f6rne\u011fin 600dp \u00fczeri) iki s\u00fctunlu,\n    \/\/ aksi takdirde tek s\u00fctunlu d\u00fczen g\u00f6ster.\n    if (screenWidthDp > 600) {\n        \/\/ Geni\u015f ekran d\u00fczeni\n        Row(modifier = Modifier.fillMaxWidth()) {\n            Column(modifier = Modifier.weight(1f).padding(16.dp)) {\n                Text(\"Geni\u015f Ekran Sol Panel\", modifier = Modifier.fillMaxWidth())\n                \/\/ Di\u011fer Composable'lar\n            }\n            Column(modifier = Modifier.weight(1f).padding(16.dp)) {\n                Text(\"Geni\u015f Ekran Sa\u011f Panel\", modifier = Modifier.fillMaxWidth())\n                \/\/ Di\u011fer Composable'lar\n            }\n        }\n    } else {\n        \/\/ Dar ekran d\u00fczeni\n        Column(modifier = Modifier.fillMaxWidth().padding(16.dp)) {\n            Text(\"Dar Ekran \u00dcst K\u0131s\u0131m\", modifier = Modifier.fillMaxWidth())\n            Text(\"Dar Ekran Alt K\u0131s\u0131m\", modifier = Modifier.fillMaxWidth())\n            \/\/ Di\u011fer Composable'lar\n        }\n    }\n}\n\n@Preview(showBackground = true, widthDp = 360)\n@Composable\nfun ResponsiveLayoutExamplePreviewPhone() {\n    \/\/ Tema eklenebilir\n    ResponsiveLayoutExample()\n}\n\n@Preview(showBackground = true, widthDp = 720)\n@Composable\nfun ResponsiveLayoutExamplePreviewTablet() {\n    \/\/ Tema eklenebilir\n    ResponsiveLayoutExample()\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>LocalConfiguration.current.screenWidthDp<\/code> ile cihaz\u0131n mevcut ekran geni\u015fli\u011fini al\u0131yoruz. E\u011fer bu geni\u015flik belirli bir e\u015fi\u011fin \u00fczerindeyse (burada 600dp), UI'\u0131 iki s\u00fctunlu bir <code>Row<\/code> olarak g\u00f6sterirken, aksi takdirde tek s\u00fctunlu bir <code>Column<\/code> d\u00fczenini tercih ediyoruz. Bu yakla\u015f\u0131m, tek bir kod taban\u0131yla farkl\u0131 cihazlara dinamik olarak uyum sa\u011flayabilen kullan\u0131c\u0131 aray\u00fczleri olu\u015fturmam\u0131z\u0131 sa\u011flar.<\/p>\n<p>Ayr\u0131ca, <code>BoxWithConstraints<\/code> Composable'\u0131, i\u00e7indeki i\u00e7eri\u011fe kendi boyutuyla ilgili k\u0131s\u0131tlamalar\u0131 ge\u00e7irir, bu da i\u00e7erideki Composable'lar\u0131n ebeveynlerinin mevcut boyutlar\u0131na g\u00f6re kendilerini uyarlamas\u0131na olanak tan\u0131r. Bu sayede, \"medya sorgular\u0131na\" benzer mant\u0131\u011f\u0131 Composable seviyesinde uygulayabiliriz.<\/p>\n<h3>Farkl\u0131 Cihaz Kategorileri \u0130\u00e7in Duyarl\u0131 UI Stratejileri<\/h3>\n<p>Duyarl\u0131 tasar\u0131m, sadece ekran boyutunu de\u011fil, ayn\u0131 zamanda kullan\u0131c\u0131lar\u0131n bu cihazlarla nas\u0131l etkile\u015fime girdi\u011fini de g\u00f6z \u00f6n\u00fcnde bulundurmal\u0131d\u0131r. A\u015fa\u011f\u0131daki tablo, farkl\u0131 cihaz kategorileri i\u00e7in yayg\u0131n UI adaptasyonlar\u0131n\u0131 \u00f6zetlemektedir:<\/p>\n<table border=\"1\">\n<thead>\n<tr>\n<th>Cihaz Kategorisi<\/th>\n<th>Tipik Ekran Boyutu<\/th>\n<th>\u00d6nerilen UI Adaptasyonlar\u0131<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Ak\u0131ll\u0131 Telefon<\/td>\n<td>< 600dp geni\u015flik<\/td>\n<td>Dikey d\u00fczenler, alt navigasyon \u00e7ubuklar\u0131, liste g\u00f6r\u00fcn\u00fcmleri, tek panel.<\/td>\n<\/tr>\n<tr>\n<td>Tablet \/ B\u00fcy\u00fck Ekranl\u0131 Telefon<\/td>\n<td>600dp - 840dp geni\u015flik<\/td>\n<td>\u0130ki panelli d\u00fczenler (master-detail), yan navigasyon men\u00fcleri, kart tabanl\u0131 \u0131zgaralar.<\/td>\n<\/tr>\n<tr>\n<td>Katlanabilir Cihaz (Masa Modu)<\/td>\n<td>Farkl\u0131 geni\u015flikler<\/td>\n<td>\u0130ki ekrana yay\u0131lan i\u00e7erik, ekran\u0131n katland\u0131\u011f\u0131 yere g\u00f6re uyarlanm\u0131\u015f d\u00fczenler, alt k\u0131s\u0131mda kontrol paneli.<\/td>\n<\/tr>\n<tr>\n<td>TV \/ B\u00fcy\u00fck Ekran<\/td>\n<td>> 840dp geni\u015flik<\/td>\n<td>Odaklanma y\u00f6netimi (D-pad ile), yan navigasyon, daha b\u00fcy\u00fck yaz\u0131 tipleri ve \u00f6\u011feler, uzaktan kumanda optimizasyonu.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Jetpack Compose ile, bu stratejileri uygulamak i\u00e7in esnek ve g\u00fc\u00e7l\u00fc ara\u00e7lara sahipsiniz. Tek bir kod taban\u0131ndan, farkl\u0131 cihaz ve ekran boyutlar\u0131na uyarlanabilen, modern ve kullan\u0131c\u0131 dostu uygulamalar olu\u015fturabilirsiniz. Bu, uygulaman\u0131z\u0131n daha geni\u015f bir kitleye ula\u015fmas\u0131n\u0131 sa\u011flarken, geli\u015ftirme ve bak\u0131m maliyetlerini de \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r.<\/p>\n<h2>Sonu\u00e7: Compose ile Android Geli\u015ftirmenin Gelece\u011fi ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Jetpack Compose, Android UI geli\u015ftirme d\u00fcnyas\u0131nda devrim niteli\u011finde bir de\u011fi\u015fim vaat ediyor ve bu de\u011fi\u015fimi \u015fimdiden ya\u015f\u0131yoruz. Bu makale boyunca, Compose'un temel prensiplerinden (deklaratif UI, Composable'lar), durum y\u00f6netimine, etkile\u015fimli bile\u015fenler olu\u015fturmaya, ileri d\u00fczey listeleme ve tema y\u00f6netimine, hatta farkl\u0131 cihazlara duyarl\u0131 tasar\u0131m yapmaya kadar bir\u00e7ok konuyu ele ald\u0131k. Lego tu\u011flalar\u0131 benzetmesiyle, k\u00fc\u00e7\u00fck ve yeniden kullan\u0131labilir bile\u015fenleri bir araya getirerek nas\u0131l karma\u015f\u0131k ve g\u00fc\u00e7l\u00fc kullan\u0131c\u0131 aray\u00fczleri in\u015fa edebilece\u011finizi g\u00f6rd\u00fck. Compose, geli\u015ftirici verimlili\u011fini art\u0131r\u0131rken, daha okunabilir, daha s\u00fcrd\u00fcr\u00fclebilir ve daha az hataya sahip kod yazmam\u0131z\u0131 sa\u011fl\u0131yor. Gelecekte Android UI geli\u015ftirmenin anahtar\u0131 hi\u00e7 \u015f\u00fcphesiz Compose olacak ve bu teknolojiyi \u00f6\u011frenmek, kariyeriniz i\u00e7in \u00f6nemli bir yat\u0131r\u0131m anlam\u0131na geliyor.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<h4>Compose geleneksel XML ile birlikte kullan\u0131labilir mi?<\/h4>\n<p>Evet, kesinlikle! Jetpack Compose, mevcut XML tabanl\u0131 uygulamalar\u0131n\u0131za kademeli olarak entegre edilebilir. <code>ComposeView<\/code> kullanarak XML d\u00fczenlerinize Compose UI'\u0131 ekleyebilir veya bir Compose uygulamas\u0131nda <code>AndroidView<\/code> kullanarak geleneksel View'lar\u0131 kullanabilirsiniz. Bu \"ge\u00e7i\u015flilik\" \u00f6zelli\u011fi, mevcut projelerinizi tamamen yeniden yazmadan Compose'a adapte olman\u0131z\u0131 sa\u011flar.<\/p>\n<h4>Compose performansl\u0131 m\u0131?<\/h4>\n<p>Evet, Compose performans\u0131 g\u00f6z \u00f6n\u00fcnde bulundurularak tasarlanm\u0131\u015ft\u0131r. Declarative UI'\u0131n do\u011fas\u0131 gere\u011fi, sadece de\u011fi\u015fen UI bile\u015fenlerini yeniden \u00e7izerek (recomposition) verimli \u00e7al\u0131\u015f\u0131r. Bu, gereksiz \u00e7izimlerden ka\u00e7\u0131narak daha ak\u0131c\u0131 kullan\u0131c\u0131 deneyimleri sunmas\u0131na olanak tan\u0131r. Do\u011fru state management ve optimizasyon teknikleriyle (\u00f6rne\u011fin, <code>remember<\/code> ve <code>derivedStateOf<\/code> kullan\u0131m\u0131) Compose uygulamalar\u0131 olduk\u00e7a performansl\u0131 olabilir.<\/p>\n<h4>Compose \u00f6\u011frenme e\u011frisi ne kadar?<\/h4>\n<p>Geleneksel Android View sistemine a\u015fina olanlar i\u00e7in ba\u015flang\u0131\u00e7ta baz\u0131 kavramsal farkl\u0131l\u0131klar (deklaratif paradigma, state management) nedeniyle orta d\u00fczeyde bir \u00f6\u011frenme e\u011frisi olabilir. Ancak, temiz ve sezgisel API'si sayesinde temel konular\u0131 kavramak genellikle h\u0131zl\u0131d\u0131r. Resmi dok\u00fcmantasyonlar, e\u011fitimler ve topluluk deste\u011fi ile bu s\u00fcre\u00e7 olduk\u00e7a kolayla\u015ft\u0131r\u0131lm\u0131\u015ft\u0131r.<\/p>\n<h4>Hangi Android s\u00fcr\u00fcmleri Compose'u destekler?<\/h4>\n<p>Jetpack Compose, Android 5.0 (API d\u00fczeyi 21) ve \u00fczeri s\u00fcr\u00fcmleri destekler. Bu, Compose ile geli\u015ftirdi\u011finiz uygulamalar\u0131n geni\u015f bir Android cihaz yelpazesine ula\u015fabilece\u011fi anlam\u0131na gelir. \u00c7o\u011fu geli\u015ftirici, modern Android cihazlar\u0131n\u0131 hedef ald\u0131\u011f\u0131 i\u00e7in bu uyumluluk yeterli olacakt\u0131r.<\/p>\n<p><\/body><br \/>\n<\/html><\/p>\n","protected":false},"excerpt":{"rendered":"Geleneksel Android UI geli\u015ftirme y\u00f6ntemleri karma\u015f\u0131k XML d\u00fczenleri ve hantal kod yap\u0131lar\u0131 nedeniyle sizi zorluyor mu? Modern Android&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-33525","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Android UI&#039;nin Lego Tu\u011flalar\u0131yla Tan\u0131\u015f\u0131n: Compose ile Ba\u015flang\u0131\u00e7 K\u0131lavuzu<\/title>\n<meta name=\"description\" content=\"Geleneksel Android UI geli\u015ftirme y\u00f6ntemleri karma\u015f\u0131k XML d\u00fczenleri ve hantal kod yap\u0131lar\u0131 nedeniyle sizi zorluyor mu? Modern Android uygulamalar\u0131 in\u015fa etmek i\u00e7in Lego tu\u011flalar\u0131 gibi yeniden kullan\u0131labilir bile\u015fenlerle, h\u0131zl\u0131 ve sezgisel bir yakla\u015f\u0131m sunan Jetpack Compose ile tan\u0131\u015f\u0131n. Bu k\u0131lavuz, deklaratif UI&#039;\u0131n g\u00fcc\u00fcn\u00fc ke\u015ffederek Android geli\u015ftirme s\u00fcrecinizi d\u00f6n\u00fc\u015ft\u00fcrmenize yard\u0131mc\u0131 olacak.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/android-uinin-lego-tuglalariyla-tanisin-compose-ile-baslangic-kilavuzu\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Android UI&#039;nin Lego Tu\u011flalar\u0131yla Tan\u0131\u015f\u0131n: Compose ile Ba\u015flang\u0131\u00e7 K\u0131lavuzu\" \/>\n<meta property=\"og:description\" content=\"Geleneksel Android UI geli\u015ftirme y\u00f6ntemleri karma\u015f\u0131k XML d\u00fczenleri ve hantal kod yap\u0131lar\u0131 nedeniyle sizi zorluyor mu? Modern Android uygulamalar\u0131 in\u015fa etmek i\u00e7in Lego tu\u011flalar\u0131 gibi yeniden kullan\u0131labilir bile\u015fenlerle, h\u0131zl\u0131 ve sezgisel bir yakla\u015f\u0131m sunan Jetpack Compose ile tan\u0131\u015f\u0131n. Bu k\u0131lavuz, deklaratif UI&#039;\u0131n g\u00fcc\u00fcn\u00fc ke\u015ffederek Android geli\u015ftirme s\u00fcrecinizi d\u00f6n\u00fc\u015ft\u00fcrmenize yard\u0131mc\u0131 olacak.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/android-uinin-lego-tuglalariyla-tanisin-compose-ile-baslangic-kilavuzu\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-03T21:31:20+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"23 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-uinin-lego-tuglalariyla-tanisin-compose-ile-baslangic-kilavuzu\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-uinin-lego-tuglalariyla-tanisin-compose-ile-baslangic-kilavuzu\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Android UI&#8217;nin Lego Tu\u011flalar\u0131yla Tan\u0131\u015f\u0131n: Compose ile Ba\u015flang\u0131\u00e7 K\u0131lavuzu\",\"datePublished\":\"2025-11-03T21:31:20+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-uinin-lego-tuglalariyla-tanisin-compose-ile-baslangic-kilavuzu\/\"},\"wordCount\":3752,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/android-uinin-lego-tuglalariyla-tanisin-compose-ile-baslangic-kilavuzu\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-uinin-lego-tuglalariyla-tanisin-compose-ile-baslangic-kilavuzu\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/android-uinin-lego-tuglalariyla-tanisin-compose-ile-baslangic-kilavuzu\/\",\"name\":\"Android UI'nin Lego Tu\u011flalar\u0131yla Tan\u0131\u015f\u0131n: Compose ile Ba\u015flang\u0131\u00e7 K\u0131lavuzu\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-03T21:31:20+00:00\",\"description\":\"Geleneksel Android UI geli\u015ftirme y\u00f6ntemleri karma\u015f\u0131k XML d\u00fczenleri ve hantal kod yap\u0131lar\u0131 nedeniyle sizi zorluyor mu? Modern Android uygulamalar\u0131 in\u015fa etmek i\u00e7in Lego tu\u011flalar\u0131 gibi yeniden kullan\u0131labilir bile\u015fenlerle, h\u0131zl\u0131 ve sezgisel bir yakla\u015f\u0131m sunan Jetpack Compose ile tan\u0131\u015f\u0131n. Bu k\u0131lavuz, deklaratif UI'\u0131n g\u00fcc\u00fcn\u00fc ke\u015ffederek Android geli\u015ftirme s\u00fcrecinizi d\u00f6n\u00fc\u015ft\u00fcrmenize yard\u0131mc\u0131 olacak.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-uinin-lego-tuglalariyla-tanisin-compose-ile-baslangic-kilavuzu\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/android-uinin-lego-tuglalariyla-tanisin-compose-ile-baslangic-kilavuzu\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-uinin-lego-tuglalariyla-tanisin-compose-ile-baslangic-kilavuzu\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Android UI&#8217;nin Lego Tu\u011flalar\u0131yla Tan\u0131\u015f\u0131n: Compose ile Ba\u015flang\u0131\u00e7 K\u0131lavuzu\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Android UI'nin Lego Tu\u011flalar\u0131yla Tan\u0131\u015f\u0131n: Compose ile Ba\u015flang\u0131\u00e7 K\u0131lavuzu","description":"Geleneksel Android UI geli\u015ftirme y\u00f6ntemleri karma\u015f\u0131k XML d\u00fczenleri ve hantal kod yap\u0131lar\u0131 nedeniyle sizi zorluyor mu? Modern Android uygulamalar\u0131 in\u015fa etmek i\u00e7in Lego tu\u011flalar\u0131 gibi yeniden kullan\u0131labilir bile\u015fenlerle, h\u0131zl\u0131 ve sezgisel bir yakla\u015f\u0131m sunan Jetpack Compose ile tan\u0131\u015f\u0131n. Bu k\u0131lavuz, deklaratif UI'\u0131n g\u00fcc\u00fcn\u00fc ke\u015ffederek Android geli\u015ftirme s\u00fcrecinizi d\u00f6n\u00fc\u015ft\u00fcrmenize yard\u0131mc\u0131 olacak.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/android-uinin-lego-tuglalariyla-tanisin-compose-ile-baslangic-kilavuzu\/","og_locale":"tr_TR","og_type":"article","og_title":"Android UI'nin Lego Tu\u011flalar\u0131yla Tan\u0131\u015f\u0131n: Compose ile Ba\u015flang\u0131\u00e7 K\u0131lavuzu","og_description":"Geleneksel Android UI geli\u015ftirme y\u00f6ntemleri karma\u015f\u0131k XML d\u00fczenleri ve hantal kod yap\u0131lar\u0131 nedeniyle sizi zorluyor mu? Modern Android uygulamalar\u0131 in\u015fa etmek i\u00e7in Lego tu\u011flalar\u0131 gibi yeniden kullan\u0131labilir bile\u015fenlerle, h\u0131zl\u0131 ve sezgisel bir yakla\u015f\u0131m sunan Jetpack Compose ile tan\u0131\u015f\u0131n. Bu k\u0131lavuz, deklaratif UI'\u0131n g\u00fcc\u00fcn\u00fc ke\u015ffederek Android geli\u015ftirme s\u00fcrecinizi d\u00f6n\u00fc\u015ft\u00fcrmenize yard\u0131mc\u0131 olacak.","og_url":"https:\/\/fatihsoysal.com\/blog\/android-uinin-lego-tuglalariyla-tanisin-compose-ile-baslangic-kilavuzu\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-03T21:31:20+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"23 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/android-uinin-lego-tuglalariyla-tanisin-compose-ile-baslangic-kilavuzu\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/android-uinin-lego-tuglalariyla-tanisin-compose-ile-baslangic-kilavuzu\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Android UI&#8217;nin Lego Tu\u011flalar\u0131yla Tan\u0131\u015f\u0131n: Compose ile Ba\u015flang\u0131\u00e7 K\u0131lavuzu","datePublished":"2025-11-03T21:31:20+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/android-uinin-lego-tuglalariyla-tanisin-compose-ile-baslangic-kilavuzu\/"},"wordCount":3752,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/android-uinin-lego-tuglalariyla-tanisin-compose-ile-baslangic-kilavuzu\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/android-uinin-lego-tuglalariyla-tanisin-compose-ile-baslangic-kilavuzu\/","url":"https:\/\/fatihsoysal.com\/blog\/android-uinin-lego-tuglalariyla-tanisin-compose-ile-baslangic-kilavuzu\/","name":"Android UI'nin Lego Tu\u011flalar\u0131yla Tan\u0131\u015f\u0131n: Compose ile Ba\u015flang\u0131\u00e7 K\u0131lavuzu","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-03T21:31:20+00:00","description":"Geleneksel Android UI geli\u015ftirme y\u00f6ntemleri karma\u015f\u0131k XML d\u00fczenleri ve hantal kod yap\u0131lar\u0131 nedeniyle sizi zorluyor mu? Modern Android uygulamalar\u0131 in\u015fa etmek i\u00e7in Lego tu\u011flalar\u0131 gibi yeniden kullan\u0131labilir bile\u015fenlerle, h\u0131zl\u0131 ve sezgisel bir yakla\u015f\u0131m sunan Jetpack Compose ile tan\u0131\u015f\u0131n. Bu k\u0131lavuz, deklaratif UI'\u0131n g\u00fcc\u00fcn\u00fc ke\u015ffederek Android geli\u015ftirme s\u00fcrecinizi d\u00f6n\u00fc\u015ft\u00fcrmenize yard\u0131mc\u0131 olacak.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/android-uinin-lego-tuglalariyla-tanisin-compose-ile-baslangic-kilavuzu\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/android-uinin-lego-tuglalariyla-tanisin-compose-ile-baslangic-kilavuzu\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/android-uinin-lego-tuglalariyla-tanisin-compose-ile-baslangic-kilavuzu\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Android UI&#8217;nin Lego Tu\u011flalar\u0131yla Tan\u0131\u015f\u0131n: Compose ile Ba\u015flang\u0131\u00e7 K\u0131lavuzu"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33525","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=33525"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33525\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33525"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33525"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33525"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}