feat(character-detail): 캐릭터 상세
- 탭 UI 추가
This commit is contained in:
@@ -11,19 +11,19 @@ import androidx.recyclerview.widget.LinearLayoutManager
|
|||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import coil.load
|
import coil.load
|
||||||
import coil.transform.CircleCropTransformation
|
import coil.transform.CircleCropTransformation
|
||||||
|
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
||||||
|
import io.reactivex.rxjava3.schedulers.Schedulers
|
||||||
import kr.co.vividnext.sodalive.R
|
import kr.co.vividnext.sodalive.R
|
||||||
import kr.co.vividnext.sodalive.base.BaseActivity
|
import kr.co.vividnext.sodalive.base.BaseActivity
|
||||||
import kr.co.vividnext.sodalive.chat.character.comment.CharacterCommentListBottomSheet
|
import kr.co.vividnext.sodalive.chat.character.comment.CharacterCommentListBottomSheet
|
||||||
|
import kr.co.vividnext.sodalive.chat.character.comment.CharacterCommentRepository
|
||||||
import kr.co.vividnext.sodalive.chat.talk.room.ChatRoomActivity
|
import kr.co.vividnext.sodalive.chat.talk.room.ChatRoomActivity
|
||||||
import kr.co.vividnext.sodalive.common.LoadingDialog
|
import kr.co.vividnext.sodalive.common.LoadingDialog
|
||||||
import kr.co.vividnext.sodalive.common.SharedPreferenceManager
|
import kr.co.vividnext.sodalive.common.SharedPreferenceManager
|
||||||
import kr.co.vividnext.sodalive.databinding.ActivityCharacterDetailBinding
|
import kr.co.vividnext.sodalive.databinding.ActivityCharacterDetailBinding
|
||||||
import kr.co.vividnext.sodalive.extensions.dpToPx
|
import kr.co.vividnext.sodalive.extensions.dpToPx
|
||||||
import org.koin.androidx.viewmodel.ext.android.viewModel
|
|
||||||
import org.koin.android.ext.android.inject
|
import org.koin.android.ext.android.inject
|
||||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
import org.koin.androidx.viewmodel.ext.android.viewModel
|
||||||
import io.reactivex.rxjava3.schedulers.Schedulers
|
|
||||||
import kr.co.vividnext.sodalive.chat.character.comment.CharacterCommentRepository
|
|
||||||
|
|
||||||
class CharacterDetailActivity : BaseActivity<ActivityCharacterDetailBinding>(
|
class CharacterDetailActivity : BaseActivity<ActivityCharacterDetailBinding>(
|
||||||
ActivityCharacterDetailBinding::inflate
|
ActivityCharacterDetailBinding::inflate
|
||||||
@@ -68,6 +68,32 @@ class CharacterDetailActivity : BaseActivity<ActivityCharacterDetailBinding>(
|
|||||||
// 뒤로 가기
|
// 뒤로 가기
|
||||||
binding.detailToolbar.tvBack.setOnClickListener { finish() }
|
binding.detailToolbar.tvBack.setOnClickListener { finish() }
|
||||||
|
|
||||||
|
// 탭 구성: 상세, 갤러리
|
||||||
|
binding.tabLayout.addTab(binding.tabLayout.newTab().setText("상세"))
|
||||||
|
binding.tabLayout.addTab(binding.tabLayout.newTab().setText("갤러리"))
|
||||||
|
binding.tabLayout.addOnTabSelectedListener(object :
|
||||||
|
com.google.android.material.tabs.TabLayout.OnTabSelectedListener {
|
||||||
|
override fun onTabSelected(tab: com.google.android.material.tabs.TabLayout.Tab) {
|
||||||
|
if (tab.position == 0) {
|
||||||
|
// 상세 탭: 기존 스크롤 화면 표시
|
||||||
|
binding.scrollViewCharacterDetail.visibility = View.VISIBLE
|
||||||
|
binding.flContainer.visibility = View.GONE
|
||||||
|
} else {
|
||||||
|
// 갤러리 탭: 컨테이너 표시 및 갤러리 프래그먼트 로드
|
||||||
|
binding.scrollViewCharacterDetail.visibility = View.GONE
|
||||||
|
binding.flContainer.visibility = View.VISIBLE
|
||||||
|
val fragment =
|
||||||
|
kr.co.vividnext.sodalive.chat.character.detail.gallery.CharacterGalleryFragment()
|
||||||
|
supportFragmentManager.beginTransaction()
|
||||||
|
.replace(R.id.fl_container, fragment)
|
||||||
|
.commit()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onTabUnselected(tab: com.google.android.material.tabs.TabLayout.Tab) {}
|
||||||
|
override fun onTabReselected(tab: com.google.android.material.tabs.TabLayout.Tab) {}
|
||||||
|
})
|
||||||
|
|
||||||
// 다른 캐릭터 리스트: 가로 스크롤
|
// 다른 캐릭터 리스트: 가로 스크롤
|
||||||
val recyclerView = binding.rvOtherCharacters
|
val recyclerView = binding.rvOtherCharacters
|
||||||
recyclerView.layoutManager = LinearLayoutManager(
|
recyclerView.layoutManager = LinearLayoutManager(
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package kr.co.vividnext.sodalive.chat.character.detail.detail
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.View
|
||||||
|
import kr.co.vividnext.sodalive.base.BaseFragment
|
||||||
|
import kr.co.vividnext.sodalive.databinding.FragmentCharacterDetailBinding
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 캐릭터 상세 - 상세 탭
|
||||||
|
* TODO: 기존 CharacterDetailActivity UI 바인딩 로직을 이 Fragment로 점진적으로 이전합니다.
|
||||||
|
*/
|
||||||
|
class CharacterDetailFragment : BaseFragment<FragmentCharacterDetailBinding>(
|
||||||
|
FragmentCharacterDetailBinding::inflate
|
||||||
|
) {
|
||||||
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
// 추후 상세 UI/로직 반영 예정
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package kr.co.vividnext.sodalive.chat.character.detail.gallery
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.View
|
||||||
|
import kr.co.vividnext.sodalive.base.BaseFragment
|
||||||
|
import kr.co.vividnext.sodalive.databinding.FragmentCharacterGalleryBinding
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 캐릭터 상세 - 갤러리 탭 (빈 화면)
|
||||||
|
*/
|
||||||
|
class CharacterGalleryFragment : BaseFragment<FragmentCharacterGalleryBinding>(
|
||||||
|
FragmentCharacterGalleryBinding::inflate
|
||||||
|
) {
|
||||||
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
// 추후 갤러리 콘텐츠 추가 예정
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,13 +11,26 @@
|
|||||||
android:id="@+id/detail_toolbar"
|
android:id="@+id/detail_toolbar"
|
||||||
layout="@layout/detail_toolbar" />
|
layout="@layout/detail_toolbar" />
|
||||||
|
|
||||||
<!-- 메인 스크롤 영역 -->
|
<com.google.android.material.tabs.TabLayout
|
||||||
|
android:id="@+id/tab_layout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_below="@+id/detail_toolbar"
|
||||||
|
android:background="@color/color_131313"
|
||||||
|
app:tabIndicatorColor="@color/color_3bb9f1"
|
||||||
|
app:tabIndicatorFullWidth="true"
|
||||||
|
app:tabIndicatorHeight="4dp"
|
||||||
|
app:tabSelectedTextColor="@color/color_3bb9f1"
|
||||||
|
app:tabTextAppearance="@style/tabText"
|
||||||
|
app:tabTextColor="@color/color_b0bec5" />
|
||||||
|
|
||||||
|
<!-- 메인 스크롤 영역 (상세 탭에서만 표시) -->
|
||||||
<androidx.core.widget.NestedScrollView
|
<androidx.core.widget.NestedScrollView
|
||||||
android:id="@+id/scroll_view_character_detail"
|
android:id="@+id/scroll_view_character_detail"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:layout_above="@+id/btn_chat"
|
android:layout_above="@+id/btn_chat"
|
||||||
android:layout_below="@+id/detail_toolbar"
|
android:layout_below="@+id/tab_layout"
|
||||||
android:clipToPadding="false"
|
android:clipToPadding="false"
|
||||||
android:fillViewport="true">
|
android:fillViewport="true">
|
||||||
|
|
||||||
@@ -499,6 +512,15 @@
|
|||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</androidx.core.widget.NestedScrollView>
|
</androidx.core.widget.NestedScrollView>
|
||||||
|
|
||||||
|
<!-- 갤러리 탭 컨테이너 -->
|
||||||
|
<FrameLayout
|
||||||
|
android:id="@+id/fl_container"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_above="@+id/btn_chat"
|
||||||
|
android:layout_below="@+id/tab_layout"
|
||||||
|
android:visibility="gone" />
|
||||||
|
|
||||||
<!-- 하단 고정 대화하기 버튼 -->
|
<!-- 하단 고정 대화하기 버튼 -->
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/btn_chat"
|
android:id="@+id/btn_chat"
|
||||||
|
|||||||
9
app/src/main/res/layout/fragment_character_detail.xml
Normal file
9
app/src/main/res/layout/fragment_character_detail.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="@color/color_131313">
|
||||||
|
|
||||||
|
<!-- TODO: 기존 상세 화면 UI를 이 레이아웃으로 이전 예정 -->
|
||||||
|
|
||||||
|
</FrameLayout>
|
||||||
17
app/src/main/res/layout/fragment_character_gallery.xml
Normal file
17
app/src/main/res/layout/fragment_character_gallery.xml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="@color/color_131313"
|
||||||
|
android:padding="24dp">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_empty_gallery"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="갤러리 콘텐츠가 없습니다."
|
||||||
|
android:textColor="@color/white"
|
||||||
|
android:textSize="16sp"
|
||||||
|
android:layout_gravity="center" />
|
||||||
|
|
||||||
|
</FrameLayout>
|
||||||
Reference in New Issue
Block a user