Kayıtlar

Hilt kullanılan projede Fragment testi

Resim
Pixabay Api sorgusundan dönen resimlerin RecyclerView içerisinde gösterildiği bir projede, bu sorguyu bir testle taklit ederek ekranın nasıl görüneceğini görmek istemiştim. Tabi projede Hilt de kullanıldığı için testte de değişiklikler oluyor. Ben bu testi anlatmak için yeni minimal bir proje oluşturdum. Test için projede yapılması gereken değişiklikleri bu yazıda irdelemek için testi sonra yapıyorum, normalde eş zamanlı yapmak lazım. Böyle bir testi yaparken uygulama mimarisinde repository olması işleri kolaşlaştırıyor. Proje Github Linki 04.10.2022 Güncelleme: Dependency Injection'da bazı değişiklikler yaptım. Bu yüzden blog yazısını da repo'yu da güncelledim. Uygulamanın Görünümü Büyütmek için tıklayın Proje yapısı Büyütmek için tıklayın ImagesRepository.kt class ImagesRepository(priv

Leetcode, Remove Duplicates from Sorted Array probleminin çözümü

class Solution { fun removeDuplicates(nums: IntArray): Int { //Eğer liste boş ise 0 döndürelim. if(nums.size == 0) return 0 //Tekrar gruplarındaki ilk elemanın indeksini işaret eden değişkenimiz. var firstIndexOfDuplications: Int = 0 for(i in 0..nums.size-1){ //Bir önceki eleman ile aynıysa döngüyü atla. if(i>0 && nums[i-1] == nums[i]) continue //Bir önceki eleman ile aynı değilse (yani farklı bir rakam geldiğinde) //Tekrar grubunun ilk elemanı hariç tüm elemanları nums[i]'ye eşitle ve //işaretçinin değerini bir artır. if(i>0){ for(x in (firstIndexOfDuplications+1)..i){ nums[x] = nums[i] } firstIndexOfDuplications += 1 } } return firstIndexOfDuplications+1 //+1 çünkü eleman sayısı soruluyor. } } Diyelim

Android navigasyon ve durum çubuğunu (navigation and status bar, system bars) şeffaf yapmak

Resim
Display content edge-to-edge in your app dökümanına göre uygulama arayüzünü sistem çubuklarının(system bars: navigation bar, status bar) arkasına geçirebilmek için şu kodu kullanıyoruz: WindowCompat.setDecorFitsSystemWindows(window, false) Ben bunu Activity'de değil Fragment'ta yapıyorum. O yüzden window 'u Fragment içinde şu şekilde alabiliriz: WindowCompat.setDecorFitsSystemWindows(requireActivity().window, false) Dökümantasyonda bu kodun onCreate() içine yazılması tavsiye edilmiş. Sistem barlarını şeffaf yapmak için themes.xml dosyalarında bunları ekliyoruz: <!-- values-v29/themes.xml --> <style name="Theme.MyApp"> <item name="android:navigationBarColor">@android:color/transparent</item> <!-- Optional: set to transparent if your app is drawing behind the status bar. --> <item name="android:statusBarColor">@android:color/transparent</item> <!-- Optional: set

Hilt kullanılan Android projesinde Retrofit testi

Resim
Öncelikle Hilt, testing dokümantasyonu nun Introduction kısmında yazdığı üzere sadece Android Instrumentation ve Robolectric testlerini destekliyor. Bu yüzden RequestServiceAndroidTest.kt dosyamı Android Test kısmında oluşturdum. Android Instrumentation test için dokümantasyon bizden AndroidJunitRunner sınıfını kalıtım alan yeni bir sınıf oluşturmamızı ve Gradle içinde class path'inin ayarlanmasını istiyor. Bu, Hilt'in tüm instrumentation testlerinde çalışmasını sağlıyor . MyTestRunner.kt class MyTestRunner: AndroidJUnitRunner() { override fun newApplication( cl: ClassLoader?, className: String?, context: Context? ): Application { return super.newApplication(cl, HiltTestApplication::class.java.name, context) } }   Gradle(Module) defaultConfig { testInstrumentationRunner "com.example.myexampleapp.MyTestRunner" } Retrofit Servis RequestService.kt interface RequestService { @GET(B

Leetcode, Merge Two Sorted Lists çözümü (Kotlin)

Soruda , sıralanmış 2 adet bağlı liste veriliyor. Bu listelerin yine sıralı bir şekilde birleştirilmesi isteniyor. Yani [1,2,3], [1,3,4] --> [1,1,2,3,3,4] şeklinde. Çözüm /** * Example: * var li = ListNode(5) * var v = li.`val` * Definition for singly-linked list. * class ListNode(var `val`: Int) { * var next: ListNode? = null * } */ class Solution { fun mergeTwoLists(list1: ListNode?, list2: ListNode?): ListNode? { //Listelerden biri veya ikisi de null ise sıralamaya gerek yok. if(list1 == null || list2 == null){ return list2?: list1 } var tempList1: ListNode? = list1 var tempList2: ListNode? = list2 //Burada head adında obje oluşturuyorum ki while döngüsünde //oluşturulacak yeni sıralı listeyi head'in devamına(next) bağlayabilelim. //Yani bizim listemiz head.next ve devamında olacak. var head: ListNode? = ListNode(0) var tempSortedList = he

Intent.ACTION_GET_CONTENT, registerForActivityResult() ve bazı hatalar

startActivityForResult() deprecated olduğundan dolayı yeni yöntem registerForResult() ile deneme amaçlı çalışırken birkaç hata ile karşılaştım, başkalarına da faydalı olması amacıyla buraya not ediyorum. Yöntem olarak Android'in sitesindeki dokümantasyonun şu başlığı ndaki ikinci örneği kullandım. class LoginFragment : Fragment() { private var _binding: FragmentLoginBinding? = null private val binding get() = _binding!! override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { _binding = FragmentLoginBinding.inflate(inflater,container,false) return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.button.setOnClickListener { getFilePath() } } private fun getFilePath(){ val intent = Intent(Intent.ACTION_GET_

Compose'da Navigation Component'in argümanlar ile kullanımı

Resim
Proje Hakkında Bu proje, sadece Navigation Component teknolojisinin argümanlar ile kullanımını göstermek için Jetpack Compose ile geliştirilen temel bir Android uygulamasıdır. Github Proje Linki github.com/mutkuensert/Compose-Navigation-With-Arguments   Açıklama Temel Kullanım Navigasyonda hangi ekranların olacağını belirleyebilmek için önce bir NavHost oluşturmak gerekiyor. Fakat NavHost'ta bir parametre olarak NavController kullanılacağı için önce bir navController instance oluşturuyoruz. val navController = rememberNavController() Ardından NavHost'u yazmaya başlayabiliriz. NavHost, az önce oluştruduğumuz NavController ve bir başlangıç noktası olmak üzere 2 parametre alıyor. Bu başlangıç noktasının adı, NavHost'un lambdası içinde oluşturacağımız yapının içindeki elemanlardan biri olmalıdır. NavHost(navController = navController, startDestination = "FirstScreen" ) FirstScreen Composable'ının navigasyon yapısı aşağıdaki şekilde olu