[英]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.