.kt
FirstFragment.kt
package com.example.imagesearchapp.ui.fragment
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import com.example.imagesearchapp.R
import com.example.imagesearchapp.databinding.FragmentFirstBinding
class FirstFragment : Fragment() {
private lateinit var binding : FragmentFirstBinding
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentFirstBinding.inflate(inflater, container, false)
return binding.root
}
}
SecondFragment.kt
package com.example.imagesearchapp.ui.fragment
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.example.imagesearchapp.databinding.FragmentSecondBinding
class SecondFragment : Fragment() {
private lateinit var binding: FragmentSecondBinding
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentSecondBinding.inflate(inflater, container, false)
return binding.root
}
}
MainActivity.kt
package com.example.imagesearchapp.ui.activity
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.viewpager2.widget.ViewPager2
import com.example.imagesearchapp.R
import com.example.imagesearchapp.databinding.ActivityMainBinding
import com.example.imagesearchapp.ui.adapter.ViewPagerAdapter
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
initViewPager()
initNavigation()
}
private fun initViewPager() {
val viewPager = binding.viewPager
val viewPagerAdapter = ViewPagerAdapter(supportFragmentManager, lifecycle)
viewPager.adapter = viewPagerAdapter
viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
binding.bottomNavigation.menu.getItem(position).isChecked = true
}
})
}
private fun initNavigation() {
binding.bottomNavigation.setOnItemSelectedListener {
when (it.itemId) {
R.id.search -> {
binding.viewPager.currentItem = 0
true
}
R.id.storage -> {
binding.viewPager.currentItem = 1
true
}
else -> false
}
}
}
}
.xml
activity_main.xml
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.activity.MainActivity">
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintStart_toStartOf="parent" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottomNavigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#B7185A1B"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/recyclerView"
app:layout_constraintVertical_bias="1.0"
app:menu="@menu/item_menu_navi" />
</androidx.constraintlayout.widget.ConstraintLayout>
<!-- [app:labelVisibilityMode]-->
<!-- auto : 항목이 3개 이하일 경우 속성이 labeled, 4개 이상일 경우 selected-->
<!-- labeled : 텍스트 항상 표시-->
<!-- selected : 아이템이 선택 되었을 때만 텍스트 표시-->
<!-- unlabeled : 텍스트 표시하지 않음-->
fragment_first.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ui.fragment.FirstFragment">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="70dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="70dp"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<!-- 빈공간 없이 꽉 채우기-->
<EditText
android:id="@+id/search_bar"
android:layout_width="0dp"
android:layout_height="39dp"
android:layout_marginStart="20dp"
android:layout_marginTop="16dp"
android:layout_weight="1"
android:background="@drawable/border"
android:hint="검색 창"
android:textSize="20sp"
app:layout_constraintTop_toTopOf="parent"
tools:layout_editor_absoluteX="31dp" />
<Button
android:id="@+id/search_btn"
android:layout_width="80dp"
android:layout_height="39dp"
android:layout_marginStart="10dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:background="#28652B"
android:text="검색" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
<!--Floating_Action_Button-->
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/btn_toTop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="20dp"
android:layout_marginBottom="100dp"
android:src="@drawable/goup_icon"
app:backgroundTint="#B7CCA6"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</FrameLayout>
fragment_second.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.fragment.SecondFragment">
<!-- TODO: Update blank fragment layout -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="second fragment" />
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="test"
android:src="@drawable/photo" />
</FrameLayout>
Adapter
package com.example.imagesearchapp.ui.adapter
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.lifecycle.Lifecycle
import androidx.viewpager2.adapter.FragmentStateAdapter
import com.example.imagesearchapp.ui.fragment.FirstFragment
import com.example.imagesearchapp.ui.fragment.SecondFragment
private const val NUM_TABS = 2
class ViewPagerAdapter(fragmentManager: FragmentManager, lifecycle: Lifecycle) :
FragmentStateAdapter(fragmentManager, lifecycle) {
override fun getItemCount(): Int {
return NUM_TABS
}
override fun createFragment(position: Int): Fragment {
when (position) {
0 -> return FirstFragment()
1 -> return SecondFragment()
}
return SecondFragment()
}
}