I want to navigate to another fragment by findNavigator. But findNavigator was declared in Fragment. So I must detect the Left to Right touch gesture on Fragment view. How can I use a detector in one fragment to navigate another fragment? Please help me...
Add(0615) I made my application by viewpager2, but transtion by currentItem is not work. It's code just respond null.
ViewPagerAdapter.kt
class ViewPagerAdapter(
list: ArrayList<Fragment>,
fm: FragmentManager,
lifecycle: Lifecycle
) : FragmentStateAdapter(fm, lifecycle) {
private val fragmentList = list
override fun getItemCount(): Int {
return fragmentList.size
}
override fun createFragment(position: Int): Fragment {
return fragmentList[position]
}
}
dayspager22.kt
class dayspager22 : Fragment() {
// TODO: Rename and change types of parameters
private var param1: String? = null
private var param2: String? = null
private var _binding: FragmentDayspager22Binding? = null
private val binding get() = _binding!!
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_PARAM1)
param2 = it.getString(ARG_PARAM2)
}
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentDayspager22Binding.inflate(inflater, container, false)
val fragmentList = arrayListOf<Fragment>(
days_1(),
days_2(),
days_3()
)
val adapter = ViewPagerAdapter(
fragmentList,
requireActivity().supportFragmentManager,
lifecycle
)
binding.views.adapter = adapter
return binding.root
}
companion object {
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment dayspager22.
*/
// TODO: Rename and change types and number of parameters
@JvmStatic
fun newInstance(param1: String, param2: String) =
dayspager22().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
}
}
}
days_1.kt
class days_1 : Fragment() {
// TODO: Rename and change types of parameters
private var param1: String? = null
private var param2: String? = null
private var _binding: FragmentDays1Binding? = null
private val binding get() = _binding!!
private var mediaPlayer: MediaPlayer? = null
private val textsize_plus: Float = 10.0f
lateinit var rootView: View
lateinit var mContext: Context
private val j: Int = 0
var size: Float = 70.0f
private lateinit var callback: OnBackPressedCallback
override fun onAttach(context: Context) {
super.onAttach(context)
mContext = context
callback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
findNavController().navigate(R.id.action_days_1_to_1to8)
}
}
requireActivity().onBackPressedDispatcher.addCallback(this, callback)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_PARAM1)
param2 = it.getString(ARG_PARAM2)
}
}
@RequiresApi(Build.VERSION_CODES.M)
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
_binding = FragmentDays1Binding.inflate(inflater, container, false)
binding.textView2.text = ""
binding.textView4.text = ""
mediaPlayer = MediaPlayer.create(activity, R.raw.days_1)
binding.seekBar.max = mediaPlayer!!.duration
binding.button1.setOnClickListener {
size -= textsize_plus
binding.gangu.setTextSize(Dimension.DP, size)
}
binding.buttonplus.setOnClickListener {
size += textsize_plus
binding.gangu.setTextSize(Dimension.DP, size)
}
binding.seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar, i: Int, b: Boolean) {
if (b) {
mediaPlayer?.seekTo(i/* * 1000*/)
if (mediaPlayer?.isPlaying == true) {
binding.seekBar.setProgress(mediaPlayer!!.currentPosition)
}
seekbar()
}
}
override fun onStartTrackingTouch(seekBar: SeekBar) {
}
override fun onStopTrackingTouch(seekBar: SeekBar) {
}
}
)
mediaPlayer?.start()
// if (mediaPlayer?.isPlaying == true) {
timer(period = 1000)
{
(mContext as Activity).runOnUiThread {
binding.seekBar.setProgress(mediaPlayer!!.currentPosition)
seekbar()
}
// }
mediaPlayer?.setOnCompletionListener {
// findNavController().navigate(R.id.action_day_1_to_days_2)
/* val pager = activity?.findViewById<ViewPager2>(R.id.dayspager)
pager?.currentItem = 2*/
}
}
binding.imageView4.setOnClickListener{
findNavController().navigate(R.id.action_1_to_main)
}
binding.startbutton.setOnClickListener{
mediaPlayer?.start()
}
binding.pausebutton.setOnClickListener {
if (mediaPlayer?.isPlaying == true) {
mediaPlayer?.pause()
binding.seekBar.setProgress(mediaPlayer!!.currentPosition)
} else {
mediaPlayer?.start()
}
}
binding.stopbutton.setOnClickListener {
mediaPlayer?.stop()
mediaPlayer = MediaPlayer.create(activity, R.raw.days_1)
val pager = activity?.findViewById<ViewPager2>(R.id.dayspager)
pager?.currentItem = 2
val pager2 = activity?.findViewById<ViewPager2>(R.id.dayspager22)
pager2?.currentItem = 1
if (pager?.currentItem == null) {
Log.e("ViewPagerFragment", "Page")
}
if (pager2?.currentItem == null) {
Log.e("ViewPagerFragment", "Page2")
}
}
fun onStop() {
super.onStop()
mediaPlayer?.release()
}
return binding.root
}
companion object {
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment days_1.
*/
// TODO: Rename and change types and number of parameters
@JvmStatic
fun newInstance(param1: String, param2: String) =
days_1().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
}
}
override fun onPause() {
super.onPause()
mediaPlayer?.stop()
}
fun seekbar() {
binding.seekBar.setProgress(mediaPlayer!!.currentPosition)
val min2: Int = mediaPlayer!!.duration / 60000
val sec2: Int = (mediaPlayer!!.duration - min2 * 60000) / 1000
val min: Int = mediaPlayer!!.currentPosition / 60000
val sec: Int = (mediaPlayer!!.currentPosition - min * 60000) / 1000
binding.textView2.text = "" + min + " : " + sec + ""
binding.textView4.text = "" + min2 + " : " + sec2 + ""
}
}
days_2 and days_3 are almost same without currentItem
currentItem is worked in dayspagers22, but not it Fragments
Use the viewPager concept in android. It helps you to move from one fragment to another by sliding the fragment.
https://developer.android.com/training/animation/screen-slide