# 로그인 유무에 따라 엑티비티 다르게 전환
이번에는 먼저 만약에 사용자가 이미 로그인했다면 앱을 실행시켰을때 바로 메인엑티비티로 가게끔 해줄것이다
현재 유저의 uid값을 가져와서 적용해줄것이다.
현재 uid의 값이 존재하면 로그인을 한 사용자일 것이고, uid값이 존재하지 않으면 로그인을 하지 않은 사용자일것이다
일단 먼저 Log값을 찍어서 어떤값이 호출되는지 봐볼것이다
class SplashActivity : AppCompatActivity() {
private lateinit var auth : FirebaseAuth
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_splash)
auth = Firebase.auth
// 이미 로그인을 했다면 바로 메인페이지로 이동하도록
if(auth.currentUser?.uid == null){
Log.d("SplashActivity", "null")
}else{
Log.d("SplashActivity", "not null")
}
...
}
}
SplashActivity.kt
로그 결과를 확인해보면 not null이 나온것을 알수있다. 따라서 로그인을 한 사용자는 else에 이어지는 코드일것이다
따라서 아래 코드와같이 이어서 작성해준다
class SplashActivity : AppCompatActivity() {
private lateinit var auth : FirebaseAuth
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_splash)
auth = Firebase.auth
// 이미 로그인을 했다면 바로 메인페이지로 이동하도록
if(auth.currentUser?.uid == null){
// 로그인하지 않은 사용자일경우
Log.d("SplashActivity", "null")
// 3초있다가 SplashActivity 종료되고, IntroActivity로 이동
Handler().postDelayed({
startActivity(Intent(this, IntroActivity::class.java))
finish()
}, 3000)
}else{
// 로그인한 사용자일 경우
Log.d("SplashActivity", "not null")
// 3초있다가 SplashActivity 종료되고, MainActivity로 이동
Handler().postDelayed({
startActivity(Intent(this, MainActivity::class.java))
finish()
}, 3000)
}
}
}
SplashActivity.kt
# 메인엑티비티 디자인, 하단 네비게이션 설정
상단에 메뉴바들을 디자인해주고 하단에 네비게이션바에 들어갈 프레그먼트 5개를 생성해준다. 프레그먼트와 연결되는 레이아웃파일들도 똑같이 5개 만들어준다
<?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=".MainActivity">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/topBar"
android:layout_width="match_parent"
android:layout_height="60dp"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:layout_width="200dp"
android:layout_height="40dp"
android:layout_margin="10dp"
android:src="@drawable/min_logo"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginTop="15dp"
android:layout_marginRight="20dp"
android:src="@drawable/main_menu"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0.5dp"
app:layout_constraintTop_toBottomOf="@+id/topBar"
android:background="#999999">
</LinearLayout>
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fragmentContainerView"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/main_nav"
android:layout_marginTop="60dp"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
activity_main.xml
메인화면을 디자인해주는데 네비게이션을 통해서, 하단에 있는 아이콘들을 눌렀을때 각각에 해당하는 프레그먼트로 이동하도록 해야되기때문에 app에서 우클릭 -> New -> Android Resource File 로 들어가서 Resource type을 Navigation으로 설정해주고 이름을 main_nav로 설정해준다음(Dependency 설정창이 나오는데 확인 눌러주기), activity_main로 돌아가서 FragmentContainerView 코드를 추가해준다.
main_nav.xml에 디자인탭으로 가서 왼쪽 상단에 있는 new division을 클릭해서 방금추가했던 프레그먼트들을 추가해준다(homeFragment, storeFragment, talkFragment, bookmarkFragment, tipFragment 추가)
그러면 이런식으로 화면이 나오는것을 확인할수있다
이제 fragment_home에다가 하단탭 아이콘을 디자인해주고, 눌렀을때 노란색바가 나타나도록 할것이기 떄문에 홈부분에 노란색 바 디자인을 추가해준다
<?xml version="1.0" encoding="utf-8"?>
<layout 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">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".fragments.HomeFragment">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="3dp"
app:layout_constraintBottom_toTopOf="@+id/linearLayout">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@color/mainColor" />
<LinearLayout
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="match_parent"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="match_parent"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="match_parent"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="match_parent"/>
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="@color/white"
android:weightSum="5"
app:layout_constraintBottom_toBottomOf="parent">
<ImageView
android:id="@+id/homeTap"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/bottom_hometap" />
<ImageView
android:id="@+id/tipTap"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/bottom_goodtip" />
<ImageView
android:id="@+id/talkTap"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/bottom_talk" />
<ImageView
android:id="@+id/bookmarkTap"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/bottom_bookmark" />
<ImageView
android:id="@+id/storeTap"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/bottom_store" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</FrameLayout>
</layout>
fragment_home.xml
아이콘을 눌렀을때 각 프레그먼트들로 이동하려면
먼저 binding을 해주는 코드를짜준다. 지금은 Fragment에 하는것이기 때문에 Activity와 binding코드가 조금 다르다
package com.example.mysololife.fragments
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import com.example.mysololife.R
import com.example.mysololife.databinding.FragmentHomeBinding
class HomeFragment : Fragment() {
private lateinit var binding : FragmentHomeBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_home, container, false)
return binding.root
}
}
HomeFragment.kt(Fragment 바인팅 틀)
이제 하단 아이콘들을 누를 때 각각의 탭이 이동할수있게 해야되기때문에 main_nav.xml로 이동해서 homeFragment를 각각의 Fragement들과 연결해준다
main_nav.xml
다시 HomeFragment로 돌아와서 아까 바인딩한 코드에 이어서 써준다
네비게이션을 이용해서 각각의 탭으로 눌렀을때 해당하는 프레그먼트로 이동하도록 짜준다
package com.example.mysololife.fragments
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.navigation.findNavController
import com.example.mysololife.R
import com.example.mysololife.databinding.FragmentHomeBinding
class HomeFragment : Fragment() {
private lateinit var binding : FragmentHomeBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_home, container, false)
// tipTap 눌렀을때 tipFragment로 이동
binding.tipTap.setOnClickListener {
it.findNavController().navigate(R.id.action_homeFragment_to_tipFragment)
}
// talkTap 눌렀을때 talkFragment로 이동
binding.talkTap.setOnClickListener {
it.findNavController().navigate(R.id.action_homeFragment_to_talkFragment)
}
// bookmarkTap 눌렀을때 bookmarkFragment로 이동
binding.bookmarkTap.setOnClickListener {
it.findNavController().navigate(R.id.action_homeFragment_to_bookmarkFragment)
}
// storeTap 눌렀을때 storeFragment로 이동
binding.storeTap.setOnClickListener {
it.findNavController().navigate(R.id.action_homeFragment_to_storeFragment)
}
return binding.root
}
}
HomeFragment.kt
그런데 이렇게하면 메뉴하단탭이 보이지 않기때문에 모든 레이아웃에 똑같이 하단탭을 추가해준다.
노란색바는 각각 눌렀을때 해당하는 탭 위에 디자인해주면 된다. 스토어 부분은 누르면 바로 페이지가 이동하게 해줄거기때문에 스토어부분은 노란색바를 표시해주지 않았다
그리고 다시 main_nav.xml로 돌아가서 각각의 프레그먼트들마다 연결을 해준다
main_nav.xml
이런식으로...
그리고 프레그먼트로 들어가서 바인딩을 시켜준뒤, 각각 탭을 눌렀을때 각각의 프레그먼트로 이동하도록 각각의 프레그먼트에 작성해줘야한다
TipFragment에서 작성한걸 보여주겠다. 이런식으로 모든 프레그먼트들에 작성해줘야한다.(앗 스토어프레그먼트는 빼고 해준다) 상당히 번거로운작업....
package com.example.mysololife.fragments
class TipFragment : Fragment() {
private lateinit var binding : FragmentTipBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = DataBindingUtil.inflate(inflater,R.layout.fragment_tip,container,false)
binding.homeTap.setOnClickListener {
it.findNavController().navigate(R.id.action_tipFragment_to_homeFragment)
}
binding.talkTap.setOnClickListener {
it.findNavController().navigate(R.id.action_tipFragment_to_talkFragment)
}
binding.bookmarkTap.setOnClickListener {
it.findNavController().navigate(R.id.action_tipFragment_to_bookmarkFragment)
}
binding.storeTap.setOnClickListener {
it.findNavController().navigate(R.id.action_tipFragment_to_storeFragment)
}
return binding.root
}
}
TipFragment.kt
이렇게 다 하면 각 아이템을 눌렀을때 각 프레그먼트들로 잘 이동하는것을 볼수있다
사실 지금한 하단네비게이션바 만드는것은 비효율적이라는 생각이 든다
그냥 이렇게 만드는 방법이 있다 정도만 알고 넘어가고 아래 적어논 게시글이 있는데 그 글을 참고해서 만드는게 더 간단할것같다
https://coding-juuwon2.tistory.com/57
[Kotlin]BottomNavigation
오늘은 BottomNavigation을 만드는 방법을 써볼것이다 우리가 사용하는 앱 대부분이 BottomNavigation으로 이루어지는 만큼 꼭 알아야되는 내용이라고 생각한다 먼저 menu라는 패키지를 만들어서 menu.xml
coding-juuwon2.tistory.com
'Android Project' 카테고리의 다른 글
[Android/Kotlin] 커뮤니티앱(5) - 북마크 만들기 (0) | 2024.01.28 |
---|---|
[Android/Kotlin] 커뮤니티앱(4) - 꿀팁 페이지 만들기 (0) | 2024.01.28 |
[Android/Kotlin] 커뮤니티앱(2) - 회원가입, 로그인, 비회원 가입 기능 구현 (0) | 2024.01.28 |
[Android/Kotlin] 커뮤니티앱 (1) - 스플래시, 회원가입, 로그인 디자인 (0) | 2024.01.28 |
[Android/Kotlin] FLO앱 클론코딩(4) - 생명주기 (0) | 2024.01.05 |