메인 - 하단 탭 추가
This commit is contained in:
@@ -0,0 +1,9 @@
|
||||
package kr.co.vividnext.sodalive.content.main
|
||||
|
||||
import kr.co.vividnext.sodalive.base.BaseFragment
|
||||
import kr.co.vividnext.sodalive.databinding.FragmentContentMainBinding
|
||||
|
||||
class ContentMainFragment : BaseFragment<FragmentContentMainBinding>(
|
||||
FragmentContentMainBinding::inflate
|
||||
) {
|
||||
}
|
@@ -4,6 +4,7 @@ import android.content.Context
|
||||
import com.google.gson.GsonBuilder
|
||||
import kr.co.vividnext.sodalive.BuildConfig
|
||||
import kr.co.vividnext.sodalive.common.ApiBuilder
|
||||
import kr.co.vividnext.sodalive.main.MainViewModel
|
||||
import kr.co.vividnext.sodalive.network.TokenAuthenticator
|
||||
import kr.co.vividnext.sodalive.settings.TermsApi
|
||||
import kr.co.vividnext.sodalive.settings.TermsRepository
|
||||
@@ -64,6 +65,7 @@ class AppDI(private val context: Context, isDebugMode: Boolean) {
|
||||
viewModel { SignUpViewModel(get()) }
|
||||
viewModel { TermsViewModel(get()) }
|
||||
viewModel { FindPasswordViewModel(get()) }
|
||||
viewModel { MainViewModel() }
|
||||
}
|
||||
|
||||
private val repositoryModule = module {
|
||||
|
@@ -0,0 +1,9 @@
|
||||
package kr.co.vividnext.sodalive.explorer
|
||||
|
||||
import kr.co.vividnext.sodalive.base.BaseFragment
|
||||
import kr.co.vividnext.sodalive.databinding.FragmentExplorerBinding
|
||||
|
||||
class ExplorerFragment : BaseFragment<FragmentExplorerBinding>(
|
||||
FragmentExplorerBinding::inflate
|
||||
) {
|
||||
}
|
@@ -0,0 +1,7 @@
|
||||
package kr.co.vividnext.sodalive.live
|
||||
|
||||
import kr.co.vividnext.sodalive.base.BaseFragment
|
||||
import kr.co.vividnext.sodalive.databinding.FragmentLiveBinding
|
||||
|
||||
class LiveFragment : BaseFragment<FragmentLiveBinding>(FragmentLiveBinding::inflate) {
|
||||
}
|
@@ -1,8 +1,183 @@
|
||||
package kr.co.vividnext.sodalive.main
|
||||
|
||||
import android.content.res.ColorStateList
|
||||
import android.os.Bundle
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.content.res.ResourcesCompat
|
||||
import kr.co.vividnext.sodalive.R
|
||||
import kr.co.vividnext.sodalive.base.BaseActivity
|
||||
import kr.co.vividnext.sodalive.common.LoadingDialog
|
||||
import kr.co.vividnext.sodalive.content.main.ContentMainFragment
|
||||
import kr.co.vividnext.sodalive.databinding.ActivityMainBinding
|
||||
import kr.co.vividnext.sodalive.databinding.ItemMainTabBinding
|
||||
import kr.co.vividnext.sodalive.explorer.ExplorerFragment
|
||||
import kr.co.vividnext.sodalive.live.LiveFragment
|
||||
import kr.co.vividnext.sodalive.message.MessageFragment
|
||||
import kr.co.vividnext.sodalive.mypage.MyPageFragment
|
||||
import org.koin.android.ext.android.inject
|
||||
|
||||
class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::inflate) {
|
||||
override fun setupView() {}
|
||||
|
||||
private val viewModel: MainViewModel by inject()
|
||||
|
||||
private lateinit var liveFragment: LiveFragment
|
||||
private lateinit var loadingDialog: LoadingDialog
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
setupBottomTabLayout()
|
||||
}
|
||||
|
||||
override fun setupView() {
|
||||
loadingDialog = LoadingDialog(this, layoutInflater)
|
||||
liveFragment = LiveFragment()
|
||||
}
|
||||
|
||||
private fun setupBottomTabLayout() {
|
||||
setupTab(
|
||||
binding = binding.tabContent,
|
||||
title = "콘텐츠",
|
||||
imageSrc = R.drawable.ic_tabbar_content,
|
||||
colorStateList = ContextCompat.getColorStateList(
|
||||
applicationContext,
|
||||
R.color.color_tabbar_title
|
||||
),
|
||||
tab = MainViewModel.CurrentTab.CONTENT
|
||||
)
|
||||
|
||||
setupTab(
|
||||
binding = binding.tabSuda,
|
||||
title = "라이브",
|
||||
imageSrc = R.drawable.ic_tabbar_live,
|
||||
colorStateList = ContextCompat.getColorStateList(
|
||||
applicationContext,
|
||||
R.color.color_tabbar_title
|
||||
),
|
||||
tab = MainViewModel.CurrentTab.LIVE
|
||||
)
|
||||
|
||||
setupTab(
|
||||
binding = binding.tabExplorer,
|
||||
title = "탐색",
|
||||
imageSrc = R.drawable.ic_tabbar_explorer,
|
||||
colorStateList = ContextCompat.getColorStateList(
|
||||
applicationContext,
|
||||
R.color.color_tabbar_title
|
||||
),
|
||||
tab = MainViewModel.CurrentTab.EXPLORER
|
||||
)
|
||||
|
||||
setupTab(
|
||||
binding = binding.tabMessage,
|
||||
title = "메시지",
|
||||
imageSrc = R.drawable.ic_tabbar_message,
|
||||
colorStateList = ContextCompat.getColorStateList(
|
||||
applicationContext,
|
||||
R.color.color_tabbar_title
|
||||
),
|
||||
tab = MainViewModel.CurrentTab.MESSAGE
|
||||
)
|
||||
|
||||
setupTab(
|
||||
binding = binding.tabMy,
|
||||
title = "마이",
|
||||
imageSrc = R.drawable.ic_tabbar_my,
|
||||
colorStateList = ContextCompat.getColorStateList(
|
||||
applicationContext,
|
||||
R.color.color_tabbar_title
|
||||
),
|
||||
tab = MainViewModel.CurrentTab.MY
|
||||
)
|
||||
|
||||
viewModel.currentTab.observe(this) {
|
||||
setTabSelected(binding.tabContent, isSelected = false)
|
||||
setTabSelected(binding.tabSuda, isSelected = false)
|
||||
setTabSelected(binding.tabExplorer, isSelected = false)
|
||||
setTabSelected(binding.tabMessage, isSelected = false)
|
||||
setTabSelected(binding.tabMy, isSelected = false)
|
||||
|
||||
changeFragment(it)
|
||||
when (it) {
|
||||
MainViewModel.CurrentTab.CONTENT -> {
|
||||
setTabSelected(binding.tabContent, isSelected = true)
|
||||
}
|
||||
|
||||
MainViewModel.CurrentTab.LIVE -> {
|
||||
setTabSelected(binding.tabSuda, isSelected = true)
|
||||
}
|
||||
|
||||
MainViewModel.CurrentTab.EXPLORER -> {
|
||||
setTabSelected(binding.tabExplorer, isSelected = true)
|
||||
}
|
||||
|
||||
MainViewModel.CurrentTab.MESSAGE -> {
|
||||
setTabSelected(binding.tabMessage, isSelected = true)
|
||||
}
|
||||
|
||||
MainViewModel.CurrentTab.MY -> {
|
||||
setTabSelected(binding.tabMy, isSelected = true)
|
||||
}
|
||||
|
||||
else -> {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupTab(
|
||||
binding: ItemMainTabBinding,
|
||||
title: String,
|
||||
imageSrc: Int,
|
||||
colorStateList: ColorStateList?,
|
||||
tab: MainViewModel.CurrentTab
|
||||
) {
|
||||
binding.tvTab.text = title
|
||||
binding.tvTab.setTextColor(colorStateList)
|
||||
binding.ivTab.setImageResource(imageSrc)
|
||||
binding.root.setOnClickListener { viewModel.clickTab(tab) }
|
||||
}
|
||||
|
||||
private fun setTabSelected(binding: ItemMainTabBinding, isSelected: Boolean) {
|
||||
binding.tvTab.isSelected = isSelected
|
||||
binding.ivTab.isSelected = isSelected
|
||||
|
||||
val fontRes = if (isSelected) {
|
||||
R.font.gmarket_sans_bold
|
||||
} else {
|
||||
R.font.gmarket_sans_light
|
||||
}
|
||||
binding.tvTab.typeface = ResourcesCompat.getFont(applicationContext, fontRes)
|
||||
}
|
||||
|
||||
private fun changeFragment(currentTab: MainViewModel.CurrentTab) {
|
||||
val tag = currentTab.toString()
|
||||
|
||||
val fragmentManager = supportFragmentManager
|
||||
val fragmentTransaction = fragmentManager.beginTransaction()
|
||||
|
||||
val currentFragment = fragmentManager.primaryNavigationFragment
|
||||
if (currentFragment != null) {
|
||||
fragmentTransaction.hide(currentFragment)
|
||||
}
|
||||
|
||||
var fragment = fragmentManager.findFragmentByTag(tag)
|
||||
if (fragment == null) {
|
||||
fragment = when (currentTab) {
|
||||
MainViewModel.CurrentTab.LIVE -> liveFragment
|
||||
MainViewModel.CurrentTab.CONTENT -> ContentMainFragment()
|
||||
MainViewModel.CurrentTab.EXPLORER -> ExplorerFragment()
|
||||
MainViewModel.CurrentTab.MESSAGE -> MessageFragment()
|
||||
MainViewModel.CurrentTab.MY -> MyPageFragment()
|
||||
}
|
||||
|
||||
fragmentTransaction.add(R.id.fl_container, fragment, tag)
|
||||
} else {
|
||||
fragmentTransaction.show(fragment)
|
||||
}
|
||||
|
||||
fragmentTransaction.setPrimaryNavigationFragment(fragment)
|
||||
fragmentTransaction.setReorderingAllowed(true)
|
||||
fragmentTransaction.commitNow()
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,35 @@
|
||||
package kr.co.vividnext.sodalive.main
|
||||
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import com.google.gson.annotations.SerializedName
|
||||
import kr.co.vividnext.sodalive.base.BaseViewModel
|
||||
|
||||
class MainViewModel : BaseViewModel() {
|
||||
enum class CurrentTab {
|
||||
@SerializedName("CONTENT")
|
||||
CONTENT,
|
||||
|
||||
@SerializedName("LIVE")
|
||||
LIVE,
|
||||
|
||||
@SerializedName("EXPLORER")
|
||||
EXPLORER,
|
||||
|
||||
@SerializedName("MESSAGE")
|
||||
MESSAGE,
|
||||
|
||||
@SerializedName("MY")
|
||||
MY
|
||||
}
|
||||
|
||||
private val _currentTab = MutableLiveData(CurrentTab.LIVE)
|
||||
val currentTab: LiveData<CurrentTab>
|
||||
get() = _currentTab
|
||||
|
||||
fun clickTab(tab: CurrentTab) {
|
||||
if (_currentTab.value != tab) {
|
||||
_currentTab.postValue(tab)
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,7 @@
|
||||
package kr.co.vividnext.sodalive.message
|
||||
|
||||
import kr.co.vividnext.sodalive.base.BaseFragment
|
||||
import kr.co.vividnext.sodalive.databinding.FragmentMessageBinding
|
||||
|
||||
class MessageFragment : BaseFragment<FragmentMessageBinding>(FragmentMessageBinding::inflate) {
|
||||
}
|
@@ -0,0 +1,7 @@
|
||||
package kr.co.vividnext.sodalive.mypage
|
||||
|
||||
import kr.co.vividnext.sodalive.base.BaseFragment
|
||||
import kr.co.vividnext.sodalive.databinding.FragmentMyBinding
|
||||
|
||||
class MyPageFragment : BaseFragment<FragmentMyBinding>(FragmentMyBinding::inflate) {
|
||||
}
|
Reference in New Issue
Block a user