콘텐츠 메인

- 탭 구성
This commit is contained in:
klaus 2025-02-12 01:54:17 +09:00
parent 5469d288ba
commit 42e4c4649b
18 changed files with 458 additions and 1 deletions

View File

@ -86,6 +86,7 @@
</intent-filter>
</activity>
<activity android:name=".main.MainActivity" />
<activity android:name=".audio_content.main.v2.AudioContentMainActivity" />
<activity android:name=".user.login.LoginActivity" />
<activity android:name=".user.signup.SignUpActivity" />
<activity android:name=".settings.terms.TermsActivity" />

View File

@ -0,0 +1,131 @@
package kr.co.vividnext.sodalive.audio_content.main.v2
import android.content.Intent
import android.graphics.Typeface
import android.widget.TextView
import androidx.core.content.res.ResourcesCompat
import com.google.android.material.tabs.TabLayout
import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.audio_content.box.AudioContentBoxActivity
import kr.co.vividnext.sodalive.audio_content.main.v2.alarm.AudioContentMainTabAlarmFragment
import kr.co.vividnext.sodalive.audio_content.main.v2.asmr.AudioContentMainTabAsmrFragment
import kr.co.vividnext.sodalive.audio_content.main.v2.content.AudioContentMainTabContentFragment
import kr.co.vividnext.sodalive.audio_content.main.v2.free.AudioContentMainTabFreeFragment
import kr.co.vividnext.sodalive.audio_content.main.v2.replay.AudioContentMainTabReplayFragment
import kr.co.vividnext.sodalive.audio_content.main.v2.series.AudioContentMainTabSeriesFragment
import kr.co.vividnext.sodalive.base.BaseActivity
import kr.co.vividnext.sodalive.common.Constants
import kr.co.vividnext.sodalive.databinding.ActivityAudioContentMainBinding
import kr.co.vividnext.sodalive.mypage.alarm.AlarmListActivity
enum class AudioContentMainTab {
HOME, SERIES, CONTENT, ALARM, ASMR, REPLAY, FREE;
companion object {
fun fromOrdinal(ordinal: Int): AudioContentMainTab? {
return values().getOrNull(ordinal)
}
}
}
class AudioContentMainActivity : BaseActivity<ActivityAudioContentMainBinding>(
ActivityAudioContentMainBinding::inflate
) {
private var fontBold: Typeface? = null
private var fontMedium: Typeface? = null
private var startTabPosition: AudioContentMainTab = AudioContentMainTab.SERIES
override fun setupView() {
startTabPosition = AudioContentMainTab.fromOrdinal(
intent.getIntExtra(
Constants.EXTRA_START_TAB_POSITION,
AudioContentMainTab.SERIES.ordinal
)
) ?: AudioContentMainTab.SERIES
setupToolbar()
loadFont()
setupTabs()
}
private fun setupToolbar() {
val toolbar = binding.toolbar
toolbar.ivContentKeep.setOnClickListener {
startActivity(
Intent(
applicationContext,
AudioContentBoxActivity::class.java
)
)
}
toolbar.ivAlarm.setOnClickListener {
startActivity(
Intent(
applicationContext,
AlarmListActivity::class.java
)
)
}
}
private fun loadFont() {
fontBold = ResourcesCompat.getFont(this, R.font.gmarket_sans_bold)
fontMedium = ResourcesCompat.getFont(this, R.font.gmarket_sans_medium)
}
private fun setupTabs() {
val tabs = binding.tabs
val tabTitles = listOf("", "시리즈", "단편", "모닝콜", "ASMR", "다시듣기", "무료")
for (title in tabTitles) {
tabs.addTab(tabs.newTab().setText(title))
}
tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab) {
val selectedTab = AudioContentMainTab.fromOrdinal(tab.position)
if (selectedTab == null || selectedTab == AudioContentMainTab.HOME) finish()
replaceFragment(selectedTab = selectedTab!!)
tab.view.isSelected = true
setTabFont(tab, fontBold)
}
override fun onTabUnselected(tab: TabLayout.Tab) {
tab.view.isSelected = false
setTabFont(tab, fontMedium)
}
override fun onTabReselected(tab: TabLayout.Tab) {
}
})
tabs.getTabAt(startTabPosition.ordinal)?.select()
replaceFragment(selectedTab = startTabPosition)
}
private fun replaceFragment(selectedTab: AudioContentMainTab) {
val startFragment = when (selectedTab) {
AudioContentMainTab.CONTENT -> AudioContentMainTabContentFragment()
AudioContentMainTab.ALARM -> AudioContentMainTabAlarmFragment()
AudioContentMainTab.ASMR -> AudioContentMainTabAsmrFragment()
AudioContentMainTab.REPLAY -> AudioContentMainTabReplayFragment()
AudioContentMainTab.FREE -> AudioContentMainTabFreeFragment()
else -> AudioContentMainTabSeriesFragment()
}
supportFragmentManager.beginTransaction()
.replace(
R.id.fl_container,
startFragment
)
.commit()
}
private fun setTabFont(tab: TabLayout.Tab, font: Typeface?) {
(tab.view.getChildAt(1) as? TextView)?.typeface = font
}
}

View File

@ -0,0 +1,9 @@
package kr.co.vividnext.sodalive.audio_content.main.v2.alarm
import kr.co.vividnext.sodalive.base.BaseFragment
import kr.co.vividnext.sodalive.databinding.FragmentAudioContentMainTabAlarmBinding
class AudioContentMainTabAlarmFragment : BaseFragment<FragmentAudioContentMainTabAlarmBinding>(
FragmentAudioContentMainTabAlarmBinding::inflate
) {
}

View File

@ -0,0 +1,9 @@
package kr.co.vividnext.sodalive.audio_content.main.v2.asmr
import kr.co.vividnext.sodalive.base.BaseFragment
import kr.co.vividnext.sodalive.databinding.FragmentAudioContentMainTabAsmrBinding
class AudioContentMainTabAsmrFragment : BaseFragment<FragmentAudioContentMainTabAsmrBinding>(
FragmentAudioContentMainTabAsmrBinding::inflate
) {
}

View File

@ -0,0 +1,9 @@
package kr.co.vividnext.sodalive.audio_content.main.v2.content
import kr.co.vividnext.sodalive.base.BaseFragment
import kr.co.vividnext.sodalive.databinding.FragmentAudioContentMainTabContentBinding
class AudioContentMainTabContentFragment : BaseFragment<FragmentAudioContentMainTabContentBinding>(
FragmentAudioContentMainTabContentBinding::inflate
) {
}

View File

@ -0,0 +1,9 @@
package kr.co.vividnext.sodalive.audio_content.main.v2.free
import kr.co.vividnext.sodalive.base.BaseFragment
import kr.co.vividnext.sodalive.databinding.FragmentAudioContentMainTabFreeBinding
class AudioContentMainTabFreeFragment : BaseFragment<FragmentAudioContentMainTabFreeBinding>(
FragmentAudioContentMainTabFreeBinding::inflate
) {
}

View File

@ -21,7 +21,6 @@ import androidx.recyclerview.widget.RecyclerView
import coil.load
import coil.transform.CircleCropTransformation
import coil.transform.RoundedCornersTransformation
import com.orhanobut.logger.Logger
import com.zhpan.bannerview.BaseBannerAdapter
import com.zhpan.indicator.enums.IndicatorSlideMode
import com.zhpan.indicator.enums.IndicatorStyle
@ -34,6 +33,8 @@ import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentRankingItem
import kr.co.vividnext.sodalive.audio_content.main.banner.AudioContentMainBannerAdapter
import kr.co.vividnext.sodalive.audio_content.main.new_content.AudioContentMainNewContentThemeAdapter
import kr.co.vividnext.sodalive.audio_content.main.ranking.AudioContentMainRankingAdapter
import kr.co.vividnext.sodalive.audio_content.main.v2.AudioContentMainActivity
import kr.co.vividnext.sodalive.audio_content.main.v2.AudioContentMainTab
import kr.co.vividnext.sodalive.audio_content.main.v2.ContentRankCreatorAdapter
import kr.co.vividnext.sodalive.audio_content.series.detail.SeriesDetailActivity
import kr.co.vividnext.sodalive.audio_content.upload.AudioContentUploadActivity
@ -334,6 +335,44 @@ class AudioContentMainTabHomeFragment : BaseFragment<FragmentAudioContentMainTab
binding.rlCategoryAudioToon.setOnClickListener {
showToast("준비중 입니다.")
}
binding.rlCategorySeries.setOnClickListener {
// startAudioContentMainActivity(AudioContentMainTab.SERIES)
requireContext().startActivity(
Intent(requireContext(), AudioContentMainActivity::class.java)
)
}
binding.rlCategoryContent.setOnClickListener {
startAudioContentMainActivity(AudioContentMainTab.CONTENT)
}
binding.rlCategoryAlarm.setOnClickListener {
startAudioContentMainActivity(AudioContentMainTab.ALARM)
}
binding.rlCategoryAsmr.setOnClickListener {
startAudioContentMainActivity(AudioContentMainTab.ASMR)
}
binding.rlCategoryReplay.setOnClickListener {
startAudioContentMainActivity(AudioContentMainTab.REPLAY)
}
binding.rlCategoryFree.setOnClickListener {
startAudioContentMainActivity(AudioContentMainTab.FREE)
}
}
private fun startAudioContentMainActivity(tab: AudioContentMainTab) {
startActivity(
Intent(requireContext(), AudioContentMainActivity::class.java).apply {
putExtra(
Constants.EXTRA_START_TAB_POSITION,
tab.ordinal
)
}
)
}
private fun setupRankCreator() {

View File

@ -0,0 +1,9 @@
package kr.co.vividnext.sodalive.audio_content.main.v2.replay
import kr.co.vividnext.sodalive.base.BaseFragment
import kr.co.vividnext.sodalive.databinding.FragmentAudioContentMainTabReplayBinding
class AudioContentMainTabReplayFragment : BaseFragment<FragmentAudioContentMainTabReplayBinding>(
FragmentAudioContentMainTabReplayBinding::inflate
) {
}

View File

@ -0,0 +1,9 @@
package kr.co.vividnext.sodalive.audio_content.main.v2.series
import kr.co.vividnext.sodalive.base.BaseFragment
import kr.co.vividnext.sodalive.databinding.FragmentAudioContentMainTabSeriesBinding
class AudioContentMainTabSeriesFragment : BaseFragment<FragmentAudioContentMainTabSeriesBinding>(
FragmentAudioContentMainTabSeriesBinding::inflate
) {
}

View File

@ -0,0 +1,41 @@
<?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"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
android:id="@+id/toolbar"
layout="@layout/toolbar_audio_content_main" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabs"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:clipToPadding="false"
android:elevation="0dp"
android:paddingHorizontal="13.3dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/toolbar"
app:tabGravity="start"
app:tabIndicatorFullWidth="false"
app:tabIndicatorHeight="0dp"
app:tabMinWidth="45dp"
app:tabMode="scrollable"
app:tabPaddingBottom="15dp"
app:tabPaddingTop="15dp"
app:tabSelectedTextColor="@color/color_3bb9f1"
app:tabTextAppearance="@style/ContentMainTabText"
app:tabTextColor="@color/color_bbbbbb" />
<FrameLayout
android:id="@+id/fl_container"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tabs" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.zhpan.bannerview.BannerViewPager
android:id="@+id/rv_banner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="13.3dp"
android:layout_marginTop="30dp" />
<com.zhpan.indicator.IndicatorView
android:id="@+id/indicator_banner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="6.7dp" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.zhpan.bannerview.BannerViewPager
android:id="@+id/rv_banner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="13.3dp"
android:layout_marginTop="30dp" />
<com.zhpan.indicator.IndicatorView
android:id="@+id/indicator_banner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="6.7dp" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.zhpan.bannerview.BannerViewPager
android:id="@+id/rv_banner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="13.3dp"
android:layout_marginTop="30dp" />
<com.zhpan.indicator.IndicatorView
android:id="@+id/indicator_banner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="6.7dp" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.zhpan.bannerview.BannerViewPager
android:id="@+id/rv_banner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="13.3dp"
android:layout_marginTop="30dp" />
<com.zhpan.indicator.IndicatorView
android:id="@+id/indicator_banner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="6.7dp" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.zhpan.bannerview.BannerViewPager
android:id="@+id/rv_banner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="13.3dp"
android:layout_marginTop="30dp" />
<com.zhpan.indicator.IndicatorView
android:id="@+id/indicator_banner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="6.7dp" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.zhpan.bannerview.BannerViewPager
android:id="@+id/rv_banner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="13.3dp"
android:layout_marginTop="30dp" />
<com.zhpan.indicator.IndicatorView
android:id="@+id/indicator_banner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="6.7dp" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>

View File

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:paddingHorizontal="13.3dp"
android:paddingTop="13.3dp">
<TextView
android:id="@+id/tv_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_toStartOf="@+id/iv_alarm"
android:fontFamily="@font/gmarket_sans_bold"
android:text="콘텐츠 마켓"
android:textColor="@color/color_3bb9f1"
android:textSize="21.3sp" />
<ImageView
android:id="@+id/iv_alarm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_toStartOf="@+id/iv_content_keep"
android:contentDescription="@null"
android:src="@drawable/ic_alarm_clock" />
<ImageView
android:id="@+id/iv_content_keep"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:contentDescription="@null"
android:src="@drawable/ic_content_keep" />
</RelativeLayout>

View File

@ -27,6 +27,11 @@
<item name="android:fontFamily">@font/gmarket_sans_medium</item>
</style>
<style name="ContentMainTabText" parent="@android:style/TextAppearance.Widget.TabWidget">
<item name="android:fontFamily">@font/gmarket_sans_medium</item>
<item name="android:textSize">16sp</item>
</style>
<style name="playlistTabText" parent="@android:style/TextAppearance.Widget.TabWidget">
<item name="android:fontFamily">@font/gmarket_sans_medium</item>
<item name="android:textSize">14.7sp</item>