[코틀린]안드로이드 스튜디오 탭메뉴 만들기
코틀린 언어를 이용한 안드로이드 스튜디오에서 탭메뉴 만들기
- 탭메뉴 만들기 : 상단에 있는 탭메뉴를 클릭시 탭메뉴 슬라이딩, 해당 Fragment 호출
1. build.gradle 에 데이터 바인딩 추가
2. activity_main.xml에 레이아웃 작성
3. app > res > drawable 에 탭메뉴 관련 xml 작성
-> round_back_white10_100.xml ( 전체메뉴 배경 xml )
-> round_back_white_100.xml (선택메뉴 xml )
4. MainActivity.kt 있는 폴더에 Fragment 작성
-> Fragment 생성시 app > res > layout 폴더에 xml이 자동으로 생김
@ build.gradle 에 데이터 바인딩 추가
buildFeatures{
dataBinding = true
}
@ activity_main.xml에 레이아웃 작성
- 기본 layout을 작성하고 탭메뉴는 LinearLayout > RelativeLayout > LinearLayout > TextView 으로 작성.
- RelativeLayout 아래에 Fragment 배치
<?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">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/holo_blue_dark">
<!-- 탭 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:background="@drawable/round_back_white10_100"
android:orientation="horizontal"
android:weightSum="3">
<TextView
android:id="@+id/tabItem1"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="1"
android:background="@drawable/round_back_white_100"
android:gravity="center"
android:text="Tab1"
android:textColor="#000000"
android:textStyle="bold"/>
<TextView
android:id="@+id/tabItem2"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="1"
android:gravity="center"
android:text="Tab2"
android:textColor="#80FFFFFF"
android:textStyle="bold"/>
<TextView
android:id="@+id/tabItem3"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="1"
android:gravity="center"
android:text="Tab3"
android:textColor="#80FFFFFF"
android:textStyle="bold"/>
</LinearLayout>
</RelativeLayout>
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fragmemtContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
</layout>
@ round_back_white10_100.xml 작성
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#1AFFFFFF"/>
<corners android:radius="100dp"/>
</shape>
@ round_back_white_100.xml 작성
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#FFFFFF"/>
<corners android:radius="100dp"/>
</shape>
@ 비어있는 Fragment 파일(Blank Fragment) 생성 후 내용 수정, 이름은 각각 OneFragment, TwoFragment, ThreeFragment 로 만들어줌
- OneFragment, TwoFragment, ThreeFragment 모두 생성후 아래 내용으로 작성. 클래스명만 다름(One, Two, Three)
package com.xxxxxx.tapviewexam
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
class OneFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_one, container, false)
}
}
@ fragment.xml 내용 : 내용은 동일하고 일단 text만 따로 작성함
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".OneFragment">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="FragmentOne"
android:gravity="center"
android:textSize="30sp"/>
</FrameLayout>
@MainActivity.kt
package com.xxxxxx.tapviewexam
import android.graphics.Color
import android.graphics.Typeface
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.animation.Animation
import android.view.animation.TranslateAnimation
import android.widget.TextView
import androidx.core.content.ContextCompat
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import com.xxxxxx.tapviewexam.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
// 현재 탭 위치
private var selectedTabNumber = 1
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//binding 초기화
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
//디폴트 설정(1번탭)
selectTab(1)
//1번탭 클릭 이벤트
binding.tabItem1.setOnClickListener{
selectTab(1)
}
//2번탭 클릭 이벤트
binding.tabItem2.setOnClickListener{
selectTab(2)
}
//3번탭 클릭 이벤트
binding.tabItem3.setOnClickListener{
selectTab(3)
}
}
// 탭 선택 이벤트
private fun selectTab(tabNumber: Int){
var selectedTextView: TextView // 선택 탭
var nonSelectedTextView1: TextView // 비선택 탭
var nonSelectedTextView2: TextView // 비선택 탭
var selectedFragment: Fragment // 선택 프래그먼트
if(tabNumber == 1){
selectedTextView = binding.tabItem1
nonSelectedTextView1 = binding.tabItem2
nonSelectedTextView2 = binding.tabItem3
selectedFragment = OneFragment()
} else if(tabNumber == 2){
selectedTextView = binding.tabItem2
nonSelectedTextView1 = binding.tabItem1
nonSelectedTextView2 = binding.tabItem3
selectedFragment = TwoFragment()
} else {
selectedTextView = binding.tabItem3
nonSelectedTextView1 = binding.tabItem1
nonSelectedTextView2 = binding.tabItem2
selectedFragment = ThreeFragment()
}
// 프래그먼트 설정
supportFragmentManager.beginTransaction()
.setReorderingAllowed(true)
.replace(R.id.fragmemtContainer, selectedFragment, null)
.commit()
// 슬라이드 이동 위치 = (선택탭 번호 - 현재 이치번호) * 텍스튜뷰 넓이값
var slideTo: Float = ((tabNumber - selectedTabNumber) * selectedTextView.width).toFloat()
var translateAnimation = TranslateAnimation(0F, slideTo, 0F, 0F)
// 구현시간(1000 = 1초)
translateAnimation.duration = 300
// 선태 번호에 따른 애니메이션 적용
when(selectedTabNumber){
1 -> binding.tabItem1.startAnimation(translateAnimation)
2 -> binding.tabItem2.startAnimation(translateAnimation)
3 -> binding.tabItem3.startAnimation(translateAnimation)
}
//애니메이션 이벤트
translateAnimation.setAnimationListener(object: Animation.AnimationListener{
override fun onAnimationEnd(p0: Animation?) {
//애니메이션 끝나면 실행
//선택 탭 설정
selectedTextView.setBackgroundResource(R.drawable.round_back_white_100)
selectedTextView.setTypeface(null, Typeface.BOLD)
selectedTextView.setTextColor(Color.BLACK)
//비선택 탭 설정
nonSelectedTextView1.setBackgroundColor(ContextCompat.getColor(applicationContext,
android.R.color.transparent))
nonSelectedTextView1.setTypeface(null, Typeface.NORMAL)
nonSelectedTextView1.setTextColor(Color.parseColor("#80FFFFFF"))
nonSelectedTextView2.setBackgroundColor(ContextCompat.getColor(applicationContext,
android.R.color.transparent))
nonSelectedTextView2.setTypeface(null, Typeface.NORMAL)
nonSelectedTextView2.setTextColor(Color.parseColor("#80FFFFFF"))
}
override fun onAnimationStart(p0: Animation?) {}
override fun onAnimationRepeat(p0: Animation?) {}
})
// 탭 번호 선택탭 변수에 담기
selectedTabNumber = tabNumber
}
}
- 유튜브 강좌 만들면서 배워가는 프로그래머(youtobe.com/c/만들면서배워가는프로그래머)를 보고 작성한 안드로이드 앱
'프로그래밍' 카테고리의 다른 글
jquery html 동영상 제어 (1) | 2023.03.24 |
---|---|
[안드로이드 스튜디오]안드로이드 앱만들기 - 샘플코드로 앱만들기 썬플라워(sunflower) (1) | 2022.10.20 |
안드로이드 스튜디오 - 하이브리드 앱만들기 (0) | 2022.10.19 |
[javascript]카페24 쇼핑몰 디자인 수정 - 상품상세페이지 특정요소 감추기 (0) | 2022.10.19 |
코틀린(kotlin) 튜토리얼 - 레모네이드 앱(app) 코드 (1) | 2022.10.05 |
댓글