简体   繁体   English

我想在片段(kotlin)中通过从左到右触摸来导航其他片段

[英]I want to navigate other fragment by Left to Right touch in fragment(kotlin)

I want to navigate to another fragment by findNavigator.我想通过 findNavigator 导航到另一个片段。 But findNavigator was declared in Fragment.但是 findNavigator 是在 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. Add(0615) 我通过 viewpager2 制作了我的应用程序,但 currentItem 的转换不起作用。 It's code just respond null.它的代码只是响应空。

ViewPagerAdapter.kt 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 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 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 的 days_2 和 days_3 几乎相同

currentItem is worked in dayspagers22, but not it Fragments currentItem 在 dayspagers22 中工作,但不是 Fragments

Use the viewPager concept in android.在 android 中使用 viewPager 概念。 It helps you to move from one fragment to another by sliding the fragment.它可以帮助您通过滑动片段从一个片段移动到另一个片段。

https://developer.android.com/training/animation/screen-slide https://developer.android.com/training/animation/screen-slide

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM