Giriş ile Android Koşullu Gezinme

Bu codelab, Advanced Android in Kotlin kursunun bir parçasıdır. Bu kurstan en iyi şekilde yararlanmak için codelab'leri sırayla incelemeniz önerilir ancak bu zorunlu değildir. Kursla ilgili tüm codelab'ler Kotlin'de İleri Düzey Android codelab'leri açılış sayfasında listelenir.


Bu codelab, FirebaseUI ile Android'de oturum açma özelliğini uygulama codelab'ine dayanmaktadır. Önceki codelab'i yapmadıysanız bu codelab'in başlangıç kodunu indirebilirsiniz ancak önce FirebaseUI ile Android'de Giriş Uygulama codelab'ini tamamlamanız faydalı olabilir.

Giriş

Uygulamanızda giriş destekleniyorsa uygulamanın bazı bölümlerini yalnızca giriş yapmış kullanıcılara ayırmak yaygın bir kullanım alanıdır. Örneğin, uygulamanızın Ayarlar ekranını yalnızca oturum açmış kullanıcılar için ayırmak isteyebilirsiniz.

Bu gibi durumlarda, kullanıcıları kimlik doğrulama durumlarına göre uygun ekrana yönlendirmek için koşullu gezinme özelliğini kullanabilirsiniz.

Bu codelab'de, mevcut bir uygulamayı temel alarak yalnızca oturum açmış kullanıcıların erişebileceği bir ayarlar ekranı ekleyeceksiniz. Bu görev için Android'in gezinme bileşenlerini kullanacaksınız.

Bilmeniz gerekenler

Neler öğreneceksiniz?

  • Kullanıcıları, oturum açıp açmadıklarına göre uygulamanızın uygun ekranlarına yönlendirme

Yapacaklarınız

  • Kullanıcıları başarılı bir şekilde giriş yaptıktan sonra doğru ekrana yönlendirme işlemini düzgün bir şekilde gerçekleştirin.
  • Kullanıcıların oturum açmadıkları takdirde Ayarlar ekranına erişmesini engelleyin ve bunun yerine onları Giriş ekranına yönlendirin.

Önceki codelab'de Android ile ilgili bilgileri gösteren bir uygulama üzerinde çalışmıştınız. Uygulamanız, kullanıcıların giriş ve çıkış yapmasına da izin veriyordu. Bu codelab'de mevcut uygulamaya bir ayarlar ekranı ekleyeceksiniz. Ayarlar ekranına yalnızca oturum açmış kullanıcılar erişebilir.

Kullanıcı giriş yapmamışsa ayarlar ekranına erişmeye çalıştığında uygulama kullanıcıyı giriş ekranına yönlendirir. Giriş akışı başarıyla tamamlandıktan sonra kullanıcı, başlangıçta erişmeye çalıştığı ayarlar ekranına geri yönlendirilir.

Bu codelab, FirebaseUI ile Android'de oturum açma özelliğini uygulama codelab'inin üzerine kurulmuştur. Önceki codelab'i yapmadıysanız bu codelab'in başlangıç kodunu indirebilirsiniz ancak önce FirebaseUI ile Android'de Giriş Uygulama codelab'ini tamamlamanız faydalı olabilir.

Örnek uygulamayı indirin. Şunlardan birini yapabilirsiniz:

Zip dosyasını indir


... veya aşağıdaki komutu kullanarak GitHub deposunu komut satırından klonlayın ve deponun start dalına geçin:

$  git clone https://github.com/googlecodelabs/android-kotlin-login-navigation

Projeyi Android Studio'ya yükledikten sonra:

  1. Geliştirmeye başlamak için ortamınızın başarıyla ayarlandığından emin olmak üzere uygulamayı bir emülatörde veya fiziksel cihazda çalıştırın.

İşlem başarılı olursa ana ekranda eğlenceli bir Android bilgisi ve sol üst köşede bir giriş düğmesi gösterilir.


Başlangıç uygulamasının mevcut özellikleri:

  • Kullanıcı oturum açmadıysa Giriş düğmesine dokunulduğunda giriş akışı başlatılır ve kullanıcının bir e-posta adresi veya Google Hesabı ile oturum açmasına izin verilir.
  • Kullanıcı oturum açtıysa düğme, kullanıcının oturumu kapatmasına olanak tanıyan bir Oturumu kapat düğmesine dönüşür.

Bu görevde, kullanıcının ayarlar ekranına gitmesine olanak tanıyan bir düğmeyi ana ekrana ekleyeceksiniz. Ayarlar ekranında kullanıcı, ana ekranda gösterilmesini istediği eğlenceli bilgileri seçebilir. Ayarlar ekranında Android veya Kaliforniya eyaleti hakkında bilgi görmeyi seçebilirler.

  1. fragment_main.xml adlı kişiyi aç.
  2. fragment_main.xml, öğesine ConstraintLayout içine yerleştirilmiş bir Ayarlar düğmesi ekleyin ve bu düğmeyi ekranın sağ üst köşesine yerleştirin.

fragment_main.xml

<TextView
       android:id="@+id/settings_btn"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_margin="@dimen/text_margin"
       android:background="@color/colorAccent"
       android:padding="10dp"
       android:text="@string/settings_btn"
       android:textColor="#ffffff"
       android:textSize="20sp"
       app:layout_constraintRight_toRightOf="parent"
       app:layout_constraintTop_toTopOf="parent"/>
  1. nav_graph.xml adlı kişiyi aç.
  2. mainFragment içine bir işlem ekleyin. İşlemin id değeri action_mainFragment_to_customizeFragment, hedefi ise customizeFragment.

nav_graph.xml

<fragment
       android:id="@+id/mainFragment"
       android:name="com.example.android.firebaseui_login_sample.MainFragment"
       android:label="MainFragment">
   <action
           android:id="@+id/action_mainFragment_to_settingsFragment"
           app:destination="@id/settingsFragment"/>
</fragment>
  1. MainFragment.kt adlı kişiyi aç.
  2. onViewCreated() içinde, settings_btn için onClickListener ayarlayın. Böylece düğmeye dokunulduğunda kullanıcı customizeFragment adresine yönlendirilir.

MainFragment.kt

binding.settingsBtn.setOnClickListener {
   val action = MainFragmentDirections.actionMainFragmentToSettingsFragment()
   findNavController().navigate(action)
}
  1. Çözülmemiş hatalar görürseniz oluşturduğunuz yeni gezinme işlemlerini oluşturmak ve kullanmak için uygulamayı Build (Derle) menüsünden yeniden derleyin.
  2. Uygulamayı yeniden başlatın. Sağ üst köşede artık işlevsel bir Ayarlar düğmesi görünmelidir.
  3. Ayarlar ekranına yönlendiren düğmeyi tıklayın. Ayarlar ekranında yalnızca bir seçenek vardır. Bu seçenek, kullanıcının ana ekranda hangi tür eğlenceli bilgilerin gösterileceğini seçmesine olanak tanır.
  4. Ana ekrana dönmek için Android cihazın geri düğmesini tıklayın.

Bu görevde, kullanıcı oturum açmadan ayarlar ekranına erişmeye çalıştığında kullanıcıyı giriş ekranına yönlendirecek kodu ekleyeceksiniz.

  1. SettingsFragment.kt adlı kişiyi aç.
  2. onViewCreated() içinde authenticationState değerini gözlemleyin ve kullanıcıyı kimliği doğrulanmamışsa LoginFragment adresine yönlendirin.

SettingsFragment.kt

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
   super.onViewCreated(view, savedInstanceState)
   val navController = findNavController()
   viewModel.authenticationState.observe(viewLifecycleOwner, Observer { authenticationState ->
       when (authenticationState) {
           LoginViewModel.AuthenticationState.AUTHENTICATED -> Log.i(TAG, "Authenticated")
           // If the user is not logged in, they should not be able to set any preferences,
           // so navigate them to the login fragment
           LoginViewModel.AuthenticationState.UNAUTHENTICATED -> navController.navigate(
               R.id.loginFragment
           )
           else -> Log.e(
               TAG, "New $authenticationState state that doesn't require any UI change"
           )
       }
   })
}

Uygulama, kullanıcı ayarlar ekranına erişmeye çalıştığında onu giriş ekranına yönlendirdiğinden giriş ekranındaki geri düğmesi davranışını da yönetmesi gerekir. Uygulama, geri düğmesi davranışını özelleştirerek ele almıyorsa kullanıcı, ayarlar ekranına geri dönmeye çalışırken sonsuz bir döngüye takılır ve tekrar giriş ekranına yönlendirilir.

  1. LoginFragment.kt adlı kişiyi aç.
  2. onViewCreated() içinde, kullanıcıyı MainFragment'ye geri getirerek geri düğmesi işlemlerini yönetin.

LoginFragment.kt

// If the user presses the back button, bring them back to the home screen
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) {
   navController.popBackStack(R.id.mainFragment, false)
}
  1. Uygulamanızı yeniden başlatın ve oturum açmadıysanız ayarlar ekranına erişme girişimlerinin artık sizi giriş akışına yönlendirdiğini doğrulayın.

Kullanıcıyı giriş yapmaya yönlendirme işlemini başarıyla gerçekleştirmiş olsanız da kullanıcının başarılı bir şekilde giriş yapmasından sonra ne olacağını ele almadığınız için giriş yapma denemeleri çalışmıyormuş gibi görünür. Bunu bir sonraki adımda düzelteceksiniz.

Şimdiye kadar, kullanıcının oturum açmadan ayarlar ekranına erişmeye çalışması durumunda giriş ekranına yönlendirilmesi için uygulamanızı başarıyla ayarladınız.

Ancak oturum açma akışını tamamladıktan sonra tekrar giriş ekranına yönlendirilirsiniz. Bu durum, iyi bir kullanıcı deneyimi sunmaz ve kafa karıştırıcı olabilir.

İdeal kullanıcı deneyimini sağlamak için uygulama, kullanıcı başarılı bir şekilde giriş yaptıktan sonra kullanıcıyı ayarlar ekranına geri getirmelidir.

  1. Hâlâ LoginFragment.kt'da, onViewCreated()'nın herhangi bir yerinde authenticationState'ı gözlemleyin ve kullanıcı kimliği başarıyla doğrulandığında kullanıcıyı SettingsFragment'a geri yönlendirin.

LoginFragment.kt

// Observe the authentication state so we can know if the user has logged in successfully.
// If the user has logged in successfully, bring them back to the settings screen.
// If the user did not log in successfully, display an error message.
viewModel.authenticationState.observe(viewLifecycleOwner, Observer { authenticationState ->
   when (authenticationState) {
      // Since our login flow is only one screen instead of multiple 
      // screens, we can utilize popBackStack(). If our login flow 
      // consisted of multiple screens, we would have to call 
      // popBackStack() multiple times.
       LoginViewModel.AuthenticationState.AUTHENTICATED -> navController.popBackStack()
       else -> Log.e(
           TAG,
           "Authentication state that doesn't require any UI change $authenticationState"
       )
   }
})
  1. Uygulamanızı tekrar çalıştırın ve artık başarılı bir şekilde oturum açtığınızda Giriş sayfası yerine Ayarlar sayfasına yönlendirildiğinizi onaylayın.

Çözüm kodunun tamamını içeren uygulamayı şu GitHub kod deposunda inceleyebilirsiniz: https://github.com/googlecodelabs/android-kotlin-login-navigation.

Bu codelab'de, oturum açmayı destekleyen bir uygulamada iyi bir kullanıcı deneyimi oluşturmaya yönelik en iyi uygulamaları öğrendiniz. Uygulamanın kimlik doğrulama durumunu gözlemleyerek kullanıcının hangi ekranlara erişebileceğini belirleyebilir ve gerektiğinde kullanıcıyı giriş ekranına yönlendirebilirsiniz.

Android'de gezinmeyle ilgili en iyi uygulamalar hakkında daha fazla bilgi için aşağıdaki kaynaklara göz atın:

Android geliştirici belgeleri:

Codelab'ler:

Bu kurstaki diğer codelab'lerin bağlantıları için Advanced Android in Kotlin codelab'lerinin açılış sayfasına bakın.