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