Open aoki2002 opened 1 year ago
ログアウトを実行するソースコード
Firebase.auth.signOut()
資料 : https://firebase.google.com/docs/auth/android/custom-auth?hl=ja
メイン画面のユーザー画面内にログアウトボタンを設置してログアウトとログアウト後のログイン画面遷移を実行する。
以下のコードを追加
UserView
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val navController = view.findNavController()
binding.userBtn1.setOnClickListener {
userViewModel.logoutButtonTapped()
navController.navigate(R.id.action_MainFragment_to_SignInFragment)
}
}
UserViewModel
fun logoutButtonTapped() {
authenticationRepository.logoutAccount()
}
AuthenticationRepository
fun logoutAccount() {
auth = Firebase.auth
auth.signOut()
}
SignInViewに画面遷移することができず、アプリが落ちてしまった。これはUserViewはもともとMainView上に表示されているのViewにもかかわらず、UserView内に画面遷移の記述をしてしまったことが原因だと考えられる。
ログアウトの挙動は確認できた。
Activity→Activityは下記コードで遷移できそう。
val intent = Intent(this, TestActivity::class.java)
startActivity(intent)
Fragment→別のActivityはどうか。
val intent = Intent(activity, SecondActivity::class.java)
startActivity(intent)
このコードでStartFragmentからSecondActivityに遷移できた。
SecondActivityにBrowseFragment、PostFragment、UserFragmentを乗せてタブ操作したい。
MainFragmentの下記コードをSecondActivityに移植したところ、画面下部にタブ表示はできたが、タブタップしても画面遷移はできなかった。
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#badcad"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:menu="@menu/menu_bar"/>
FindNavControllerしたらタブ切り替えで遷移できるようになった
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
val navController = findNavController(R.id.nav_host_fragment)
findViewById<BottomNavigationView>(R.id.bottom_navigation).setupWithNavController(navController)
}
}
下記コードで、ユーサー画面遷移時に自動的にActivityに遷移することを確認。
package com.example.sns_app.view
import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.navigation.findNavController
import androidx.navigation.fragment.findNavController
import com.example.sns_app.Activity
import com.example.sns_app.R
import com.example.sns_app.databinding.FragmentUserBinding
import com.example.sns_app.viewmodel.UserViewModel
class UserView: Fragment() {
private lateinit var binding: FragmentUserBinding
val userViewModel: UserViewModel by viewModels()
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
super.onCreateView(inflater, container, savedInstanceState)
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_user, container, false)
binding.viewModel = userViewModel
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val intent = Intent(activity, Activity::class.java)
startActivity(intent)
}
}
ボタンのタップ処理で遷移動作させようとすると動かない。 多分setOnClickListenerが呼ばれていない。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.userBtn1.setOnClickListener() {
val intent = Intent(activity, Activity::class.java)
startActivity(intent)
}
}
logoutButtonTappedはXMLでUserFragmentと紐づいているから呼ばれている。ログイン処理もできている
userViewModelにログイン状態を変数に持たせて、viewが監視することで遷移書処理を実行できそう
下記コードでログアウト後のスタート画面への遷移を確認。
https://github.com/aoki2002/sns_app/assets/116154955/2c5f7798-600b-450a-9b2f-b291fd4a8cd9
BrowseFragment、PostFragment、UserFragmentの画面遷移を別のActivityで管理する。また、MainFragmentをMainActivityに移植する。
MainActivityに以下のコードを追加してBottomNavigationを設定しようとした結果、次のようなエラーが出力された。
MainActivity
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val navController = findNavController(R.id.nav_bar_host)
setupWithNavController(bottom_navigation, navController)
}
エラー文
Unresolved reference: android
Unresolved reference: bottom_navigation
MainActivityにはactivity_main.xmlを紐づけており、そこにBottomNavigationの設定を移植させているため、MainActivityにimportしている以下のモジュールが機能していないことが原因だと考えられる。
高齢者散歩マッチングアプリを開発している際にも同様のコードを使用して正しく動作したため、そのコードと比較して原因を探る。
@aoki2002 さん MainFragmentが不要に思えたので私の作業環境ではmainFragmentを削除してMainActivity上にBrowseFragment、PostFragment、UserFragmentを載せています。
できればここの実装はさらっと完了して次のタスクに進んでいただきたいです。
@yota-hara さん 承知しました。MainFragmentは確かに不要なので削除します。
MainActivityのonCreateメソッドに以下を追加する。
val bottomNavigation: BottomNavigationView = findViewById((R.id.bottom_navigation))
ログアウト後にログイン画面に遷移することが確認できた。
概要
SNSアプリのユーザー画面にAuthentication認証を使用したログアウト機能を実装し、実機テストを行う。