Study Galaxy; bitirme projem olan bir android uygulamasıdır.
Projedeki Teknolojiler: MVVM Mimarisi, Data Binding
Önce projenin gradle dosyalarında gerekebilecek değişiklikleri yaptım.
Android Studio güncellemesinden sonra artık proje bağımlılıklarını settings.gradle dosyasındaki dependencyResolutionManagament bloğunda belirtmeliyiz. bu yüzden jcenter() satırını settings.gradle dosyasına ekledim.
settings.gradle dosyası :
pluginManagement {
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
jcenter()
google()
mavenCentral()
}
}
rootProject.name = "StudyGalaxy"
include ':app'build.gradle (project) dosyası :
/* Sonradan yaptığım eklemeler: */
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext.kotlin_version = "1.7.21"
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.0.2"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
def nav_version = "2.3.0"
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
/* Sonradan yaptığım eklemeler buraya kadardı. */
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
id 'com.android.application' version '7.4.0' apply false
id 'com.android.library' version '7.4.0' apply false
id 'org.jetbrains.kotlin.android' version '1.7.21' apply false
}
task clean(type: Delete) {
delete rootProject.buildDir
}build.gradle (app-module) dosyası :
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
// Eklemelerim :
id 'kotlin-android-extensions'
id 'androidx.navigation.safeargs.kotlin'
id 'kotlin-kapt'
}
android {
namespace 'com.example.studygalaxy'
compileSdk 33
defaultConfig {
applicationId "com.example.studygalaxy"
minSdk 23
targetSdk 33
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
// DataBinding'i aktif hale getirelim:
dataBinding{
enabled = true
}
}
dependencies {
// Güncellemeleri yapmadan önce gerekli tanımlamaları yapalım:
def retrofitVersion = '2.8.1'
def glideVersion = '4.11.0'
def rxJavaVersion = '2.2.8'
def rxAndroidVersion = '2.1.1'
def roomVersion = '2.5.0'
def navVersion = '2.5.3'
def preference_version= '1.2.0'
implementation 'androidx.core:core-ktx:1.9.0'
implementation 'androidx.appcompat:appcompat:1.6.0'
implementation 'com.google.android.material:material:1.8.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
// Sonradan eklediğim implementation'lar:
implementation "androidx.room:room-runtime:$roomVersion"
kapt "androidx.room:room-compiler:$roomVersion"
implementation "androidx.room:room-ktx:$roomVersion"
implementation "androidx.navigation:navigation-fragment-ktx:$navVersion"
implementation "androidx.navigation:navigation-ui-ktx:$navVersion"
implementation "com.squareup.retrofit2:retrofit:$retrofitVersion"
implementation "com.squareup.retrofit2:converter-gson:$retrofitVersion"
implementation "com.squareup.retrofit2:adapter-rxjava2:$retrofitVersion"
implementation "io.reactivex.rxjava2:rxjava:$rxJavaVersion"
implementation "io.reactivex.rxjava2:rxandroid:$rxAndroidVersion"
implementation "com.github.bumptech.glide:glide:$glideVersion"
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
implementation "androidx.preference:preference-ktx:$preference_version"
}build.gradle dosyalarının düzenlemelerini ilerde kullanabileceğim şeyleride düşünerek şimdilik böyle yaptım. Fakat sonradan değişebilir.
Uygulama logosunu figmada oluşturup svg ve png formatlarında indirdim. svg formatında olanı bikgisayarda manuel olarak proje dosyasına ekledim. png olanı ise android studio'dan drawable kalsörüne ekledim. Sonrasında drawable klasörü içinde bir vector asset oluşturarak svg formatındaki logonun xml dosyasını elde ettim:
Seçtiğim renkleri colors dosyasına ekledim:
Çalışmaya başlamadan önce Fragment dosyalarını aşağıdaki hale getirdim:
drawable -> new -> drawable resources file :
Bir xml dosyası açmış olduk burada button'lar için bir arkaplan style'ı belirledim:
Themes.xml dosyasında butonlar için bir style belirledim:
App genelinde kullanacağım stringleri bu şekilde tanımlıyorum:
Şimdi sign in için kullanacağım fragment'ı düzenlemeye başlıyorum:
Frame Layout'a bir ID ekledim.
Fragmentları activity'ye bağlamadan emülatörde göremeyiz!
NOT: Fragment'ı kullanabilmek için FragmentManager denen yapıyı çağırmalıyız. ve yapacağımız işlemleri başlatmak için fragmentTransaction denen bir yapı oluşturuyoruz.
Sign in ve sign up işlemleri için iki farklı fragment tasarımı yaptım:
Sign In ve Sign Up ekranları arasındaki geçişi textView'lara onClick metodu vererek yapacağım. Aşağıdaki resimde kırmızı işaretli yerlere koyduğum textView'lara tıklandığında iki ekran arası geçiş sağlanacak:
activity_main.xml dosyasında constraint layout'un içine fragment'ları göstermek için bir frame layout ekleyelim:
Ekledikten sonra frameLayout'a bir id verelim:
Şimdi oluşturduğum fragment'lar için navigation framework'ünü kullanacağım.
Önce navigation için gerekli gradle eklemelerini kontrol ettim. Bir eksik olmadığı için devam ettim.
Şimdi fragment'lar arası geçiş ve veri aktarımını ayarlayacağım. RES klasörü altında bir navigation grafiği oluşturalım. Bunun için RES -> new -> android resource file (aşağıda işaretli 3 alanı belirledik):
Bir projenin içinde birden fazla navigation grafiği oluşturulabileceği için isimlendirmeye dikkat ettim.
MainActivity.kt'de onClickSignInText ve onClickSignUpText metodlarını implemente edelim:
package com.example.studygalaxy.view
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import com.example.studygalaxy.R
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
fun onClickSignInText(view : View){
// Fragment'ı kullanabilmek için FragmentManager denen yapıyı çağırmalıyız:
val fragmentManager = supportFragmentManager
// Yapacağımız işlemleri başlatmak için fragmentTransaction denen bir yapı oluşturuyoruz.
// Bu fragment ile ilgili değişiklik yapacağız demiş oluyoruz:
val fragmentTransaction = fragmentManager.beginTransaction()
// Artık işlemlerimizi fragmentTransaction kullanarak yapabiliriz.
// Fragment oluşturalım:
// Eşitliğin sağ tarafı Fragment'ın ismi:
val signInFragment = SignInFragment()
// replace: Öncesinde bir fragment varsa onu kaldırır ve istediğimiz fragment'ı ekler.
// ilk parametre: Bu fragment'ı kim kullanacak
// ikinci fragment: hangi fragment'ı gösterecek
// .commit() diyerek transaction'ı commit ediyorum yani burada yaptığım işlemi artık sonlandırıyorum:
fragmentTransaction.replace(R.id.frameLayoutID, signInFragment).commit()
}
fun onClickSignUpText(view : View){
val fragmentManager = supportFragmentManager
val fragmentTransaction = fragmentManager.beginTransaction()
// Fragment oluşturalım:
// Eşitliğin sağ tarafı Fragment'ın ismi:
val signUpFragment = SignUpFragment()
// replace: Öncesinde bir fragment varsa onu kaldırır ve istediğimiz fragment'ı ekler.
// ilk parametre: Bu fragment'ı kim kullanacak
// ikinci fragment: hangi fragment'ı gösterecek
// .commit() diyerek transaction'ı commit ediyorum yani burada yaptığım işlemi artık sonlandırıyorum:
fragmentTransaction.replace(R.id.frameLayoutID, signUpFragment).commit()
}
}Oluşturduğumuz frameLayout içine bir NavHostFragment ekledik ve hazırladığımız navigation graph'ı seçtik:
Oluşturduğumuz Mainactivity'den action bar'ı kaldırmak istiyoruz bu yüzden Android.Manifest.xml dosyasına aşağıda işaretlediğimiz satırı ekledik:
MainActivity2 içinde bir bottom navigation bar oluşturacağım. Araştırdığımda bottom navigation bar içinde 3 ila 5 tane item olabileceğini gördüm. Ben 5 tane kullanacağım. Bir activity içinde 5 fragment ile fraklı işlevleri göstereceğim.
Bir yandan da bu activity'yi oluşturduğum andan itibaren view binding kullanmaya başlayacağım.
View Binding'i kullanmak için öncelikle build.gradle (app-module) dosyasında view binding’i aktive etmemiz gerekiyor bunun için android bloğunun içine aşağıdaki kodu eklememiz gerekiyor:
// ViewBinding'i aktif hale getirelim:
viewBinding{
enabled = true
}Sonrasında MainActivity2'de view binding kullanmak istediğim için aşağıdaki işlemleri yapıyorum:
package com.ozlem.studygalaxy
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.ozlem.studygalaxy.databinding.ActivityMain2Binding
class MainActivity2 : AppCompatActivity() {
// view binding için :
private lateinit var binding2 : ActivityMain2Binding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// view binding için :
binding2 = ActivityMain2Binding.inflate(layoutInflater)
setContentView(binding2.root)
}activity_main2.xml dosyasına gidiyoruz ve arama çubuğundan aratıp bularak ekrana bir bottom navigation view ekliyoruz. Sonra constraint layout içine bir frame layout ekliyoruz sonuç olarak component tree şu hali alıyor:
Elde etmek istediğimiz görünüm bu:
Bu yüzden activity_main2.xml dosyasının kod bölümünü aşağıdaki hale getiriyoruz:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity2">
<FrameLayout
android:id="@+id/frameLayout2ID"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@+id/bottomNavigationViewId"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
</FrameLayout>
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottomNavigationViewId"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
</com.google.android.material.bottomnavigation.BottomNavigationView>
</androidx.constraintlayout.widget.ConstraintLayout>Şimdi fragment'lar için bottom navigation view'da görüncek icon'lara ihtiyacımız var. Bu yüzden her icon için bir vector asset oluşturmalıyız. Bunu şu şekilde yapıyorum:
Açılan ekranda clip_art'ı işaretledikten sonra işaretli yere tıklayarak icon seçiyoruz:
İstediğimiz icon'u bu şekilde aratarak bulabiliriz:
Rengi için sonradan xml dosyasından değişiklik yapabileceğim için değiştirmiyorum:
Toplam 5 icon için 5 adet vector asset oluşturdum :
Şimdi bottom navigation view için bir menu'ye ihtiyacımız var bu yüzden yeni bir android resource directory oluşturuyoruz:
Şimdi menu > new > menu resource file:
Sonrasında bottom navigation bar'da kaç bölüm olmasını istiyorsak o kadar menu item’ı şekilde göründüğü gibi component tree’nin içine sürüklemeliyiz:
Şuanda elimizde bu var:
Sonrasında title (başlık) bölümlerini değiştirdik:
Icon'ları ve id'leri ekleyelim:
activity_main2.xml dosyasına gidip bunu ekliyoruz:
Şuanda elimizde olan görüntü bu:
Şimdi bottom navigation bar’daki bölüm sayısı kadar fragment oluşturmalıyız.
Bu fragment'ları belirlediğim özelliklere göre yapılandıracağım.
MainActivity2 için gerekli şeyleri ekleyelim:
package com.ozlem.studygalaxy.view
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.fragment.app.Fragment
import com.ozlem.studygalaxy.*
import com.ozlem.studygalaxy.databinding.ActivityMain2Binding
class MainActivity2 : AppCompatActivity() {
// view binding için :
private lateinit var binding2 : ActivityMain2Binding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// view binding için :
binding2 = ActivityMain2Binding.inflate(layoutInflater)
setContentView(binding2.root)
// İlk açıldığında home page'i göstermek için:
replaceFragment(HomeFragment())
// bottom navigation bar'ın listener'ını yazalım:
binding2.bottomNavigationViewId.setOnItemSelectedListener {
when(it.itemId){
// Burada sol tarafta bottom_navigation_menu.xml'deki id'leri kullanıyoruz,
// Sağ tarafta ise Fragment'ların dosya isimlerini kullanıyoruz:
R.id.statistics_icon_id -> replaceFragment(StatisticsFragment())
R.id.goals_icon_id -> replaceFragment(GoalsFragment())
R.id.home_icon_id -> replaceFragment(HomeFragment())
R.id.calender_icon_id -> replaceFragment(CalenderFragment())
R.id.profile_icon_id -> replaceFragment(ProfileFragment())
else ->{ }
}
true
}
}
private fun replaceFragment(fragment : Fragment){
val fragmentManager = supportFragmentManager
val fragmentTransaction = fragmentManager.beginTransaction()
// activity_main2.xml'deki frame layout'un id'si: frameLayout2ID :
fragmentTransaction.replace(R.id.frameLayout2ID,fragment)
fragmentTransaction.commit()
}
}Manifest dosyasında MainActivity2 için action bar'ı kapattım:
Şimdi önce fragment'lar için UI kısmını düzenleyeceğim sonrasında navigation_graph'lerini çıkaracağım.
Ekranın başındaki tasarımlar kodlara bakılarak anlaşılabilir ancak nestedScrollView içine constraint Layout atınca constraint layout'un içindeki tasarımı yapmak biraz zorlayabiliyor çünkü eklediğim view'ların constraint'lerini xml'de yazarak belirlemem gerekti.
RecylerView'lu bölüme geçiyorum. Önce layout klasöründe bir layout resource file oluşturdum burada recycler view'un tek satırının tasarımını yapacağım. Dosyanın adını "goals_recycler_row.xml" olarak belirledim.
goals_recyler_row.xml
<?xml version="1.0" encoding="utf-8"?>
<!--Bu dosyada recyclerView'umuzun bir satırını tasarlayacağız.-->
<!--Bu xml her bir recyclerView sırasında kullanılacak.-->
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/constraint_layout_id_0"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:layout_marginTop="20dp"
android:background="@drawable/info_space_style">
<LinearLayout
android:id="@+id/linear_layout_id_0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/textview_0_id"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_gravity="center"
android:fontFamily="@font/roboto_bold"
android:gravity="center"
android:text="Final Project"
android:textAlignment="center"
android:textColor="@color/white"
android:textSize="18dp" />
<TextView
android:id="@+id/textview_1_id"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_gravity="center"
android:fontFamily="@font/roboto_bold"
android:gravity="center"
android:text="Everyday"
android:textAlignment="center"
android:textColor="@color/white"
android:textSize="18dp" />
</LinearLayout>
<LinearLayout
android:id="@+id/linear_layout_id_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/imageView"
app:layout_constraintStart_toEndOf="@+id/linear_layout_id_0"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/textview_2_id"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_gravity="center"
android:fontFamily="@font/roboto_bold"
android:gravity="center"
android:text="%99"
android:textAlignment="center"
android:textColor="@color/white"
android:textSize="18dp" />
<TextView
android:id="@+id/textview_3_id"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_gravity="center"
android:fontFamily="@font/roboto_bold"
android:gravity="center"
android:text="04.00.00"
android:textAlignment="center"
android:textColor="@color/white"
android:textSize="18dp" />
</LinearLayout>
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/menu_icon"
android:layout_margin="20dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>Tasarımı şu şekilde oldu:
Şimdi menu klasöründe bir menu resource file açalım ve ismini goals_menu.xml koyalım:
goals_menu.xml dosyasını aşağıdaki şekilde yapılandırdım:
Önce build.gradle(app-module) dosyasına ilgili eklemeyi yaptım:
Şimdi recylerView'u görüntülemek istediğimiz yere yani "fragment_home.xml" dosyasına recyclerView ekleyelim:
constraint layout içine bir tane frame layout attım onun içinede recycler view ekledim:
Diğer aşamalara devam etmeden önce projenin firebase aktivasyonunu yapmak istiyorum çünkü artık yavaş yavaş kullanıcı işlemleri ile iligli sonuçları görebilmem gerekiyor.
Firebase’e android uygulamamız ile firebase’i birleştireceğimizi belirtelim:
Uygulamanın paket ismini girdim ve "Register App" butonuna tıkladım:
İkinci adımda bizim için bir dosya oluşturuluyor. Bu dosya bizim android projemiz ile firebase sunucusunu birbirine bağlayan dosya ve bu dosya olmadan hiçbir işlem yapamıyoruz. Bu yüzden bu dosyayı indiriyorum:
Sonrasında google-services.json dosyasını projemin içine alıyorum bunun için Android Studio'da android görünümünden project görünümüne geçiyorum ve dosyayı app bölümüne yapıştırıyorum:
Aslında google-services.json dosyasının içindekilerin herhangi birine gösterilmemesi gerekiyor fakat bu projeyi Google Play Store'a yüklemeyeceğim.
Şimdi 3. adıma geçiyorum. Bu adımda projeme Firebase SDK'sını ekliyorum. Bu adım 2 aşamalı.
- ADIM: Bunun için build.gradle (project) dosyasına; aşağıda işaretlediğim kısmı dependencies bloğuna ekliyorum. Çünkü güncellemelerden sonra artık allProjects bloğu settings.gradle dosyasında bulunuyor ve buildScript kısmıda zaten build.gradle (project) dosyamda mevcut.
sync now işlemini yaptıktan sonra ikinci adıma geçiyorum.
- ADIM: Sonra 2. adımda ilgili kodları build.gradle (module-app) dosyasına ekliyorum:
Artık işlem tamamlandı "Continue to Console" butonu ile console'a geri dönüyoruz:
Firebase'in projeye entegre olup olmadığını kontrol etmek amacıyla MainActivity.kt içindeki onCreate metodunun içine Firebase yazıp ilgili özellikler geldi mi diye bakıyoruz:
Firebase Authentication modülü; kullanıcıların kayıt olabilmesi, giriş yapabilmesi, giriş yapılıp yapılmadığının algılanması gibi özellikleri barındırır.
Firebase Console’da soldaki bölümden Authentication’a tıklayalım:
Buradaki “Get started” butonu ile authentication yani kullanıcı işlemlerini başlatalım. Get started butonuna basınca şöyle bir ekranla karşılaşıyoruz:
Sign-in method’lardan birini, birden fazlasını ya da hepsini uygulamamızda kullanmak isteyebiliriz. Ben email ve parola kullanacağım. Yaptığımız etkinleştirmeleri android tarafında da uygulamam gerekiyor.
Email/password seçeneğine tıkladıktan sonra karşımıza gelen ekranda enable yaparak aktif hale getiriyoruz. Resimdeki 2. enable direkt email’e giriş linki atarak password kullanmadan giriş yapmayı sağlıyor ama bunu kullanmayacağım. “Save” butonuna basalım:
Etkinleştirildi:
Bütün modüllerin ayrı SDK’sı var. Firebase’in bir sürü modülü var ve hepsini kullanmıyoruz. Yük olmaması içinde modüllere ait SDK’lar tek tek kuruluyor.
Documentation kısmından Build > Aythentication bölümüne gittik. Sonra aşağıdaki bölüme geçelim:
Ve Android kodları tarafında gerekli authentication işlemlerini yapmaya başlayalım:
Aşağıda işaretli satırı build.gradle (app-module) içine ekleyelim:
Şimdi dokümanda bir FirebaseAuth objesi oluşturmamız isteniyor. Sırayla aşağıdaki işlemleri MainActivity.kt içinde yapıyoruz:
Şİmdi güncel kullanıcı yani current user'ı alabilirsin diyor fakat henüz hiçbir kullanıcı oluşturmadım.
Bu yüzden SignInFragment ve SignUpFragment'ta kod düzenlemelerini ayarlayalım:
Önce iki fragment'a ait kt dosyalarında FirebaseAuth objeleri oluşturma işlemini yaptım:
Fragment'ta view binding işlemi activity'ye göre farklı işliyor bunun için onCreate yerine onCreateView metodunu kullanıyoruz. Aynı zamanda onDestroy metodundada binding'i null yapıyoruz:
class SignInFragment : Fragment() {
// Bir FirebaseAuth objesi oluşturalım:
private lateinit var auth: FirebaseAuth
// view binding için:
private var _binding: FragmentSignInBinding? = null
private val binding get() = _binding!!
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Oluşturduğumuz FirebaseAuth objesini initialize edelim:
auth = Firebase.auth
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// view binding için:
_binding = FragmentSignInBinding.inflate(inflater, container, false)
val view = binding.root
return view
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}Başlatmak için “Create Database” butonuna basmalıyız. Bunu yaptığımızda güvenlik ayarlarını nasıl seçmek istediğimizi soruyor. Burada güvenlikten kastedilen şey veritabanımıza kimin erişebileceği ve kimin erişemeyeceği. Bunun için iki farklı seçeneğimiz var.
- Production Mode: Hiçbir şeye izin vermez.
- Test Mode: Herkesin erişimine izin verir ve bunun için 30 günlük bir süre tanımlar. Bunu github’daki token’lara benziyor.
Şimdilik kodlama aşamasında olduğum için test modunda başlatıyorum.
“Test Mode” u seçtikten sonra Next butonuna basalım.
İkinci adımda lokasyon seçmemizi istiyor. Bunu uygulamayı yapacağımız yere yakın seçmemiz gerekiyor.
eur3 seçeneğini seçip Enable butonuna bastım. Bu işlemi sadece bir kez yapıyoruz bir daha karşımıza gelmeyecek. Şu anda bizim için firestore veritabanı oluşturuluyor.
Şimdi oluşturulan alanda kendi database'imi kuracağım.
Kod tarafında build.gradle (app-module) kısmına ekleme yaptım:





























































