首页 > 解决方案 > Kotlin 从 Fragment 访问项目

问题描述

我是 Kotlin 的新手。我创建了一个空白活动,添加了一个 SeekBar,并且我能够覆盖它的方法以获得我想要的功能。但是,如果我创建一个选项卡式活动,则在使用相同的代码时我无法这样做。我无法弄清楚如何访问片段中的项目。

我修改了我的 gradle 构建以包括id 'kotlin-android-extensions'

我在 fragment_main.xml 中添加了 SeekBar 和 TextView

    <SeekBar
        android:id="@+id/strandsSpeed"
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:min="0"
        android:max="1023"
        android:scaleX="1.5"
        android:scaleY="1.5"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:text="TextView"
        android:textSize="36sp"
        app:layout_constraintTop_toBottomOf="@+id/strandsSpeed"
        tools:layout_editor_absoluteX="173dp" />

我在 PlaceholderFragment.kt 中修改了 onCreate()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        strandsSpeed?.setOnSeekBarChangeListener(object: SeekBar.OnSeekBarChangeListener {
            override fun onProgressChanged(strandsSpeed: SeekBar, progress: Int, fromUser: Boolean) {}

            override fun onStartTrackingTouch(strandsSpeed: SeekBar) {}

            override fun onStopTrackingTouch(strandsSpeed: SeekBar) {
                textView.text = getString(R.string.test)
            }
        })
        pageViewModel = ViewModelProvider(this).get(PageViewModel::class.java).apply {
            setIndex(arguments?.getInt(ARG_SECTION_NUMBER) ?: 1)
        }
    }

我在 MainActivity.kt 中尝试了相同的代码。没有结果。我还在 MainActivity.kt 中尝试了敬酒。没有结果。没有片段,代码可以正常工作。覆盖 onProgressChanged() 时也没有结果。我的猜测是由于 strandsSpeed 和 textView 当前位于片段中。

标签: androidkotlinandroid-fragments

解决方案


我将其setOnSeekBarListener()移至onCreateView()并使用了充气机:

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {
    val inf = inflater.inflate(R.layout.fragment_strands, container, false)
    inf.strandsSpeed.setOnSeekBarChangeListener(object: SeekBar.OnSeekBarChangeListener {
        override fun onProgressChanged(strandsSpeed: SeekBar, progress: Int, fromUser: Boolean) {
            txtView.text = progress.toString()
        }

        override fun onStartTrackingTouch(strandsSpeed: SeekBar) {}

        override fun onStopTrackingTouch(strandsSpeed: SeekBar) {}
    })
    return inf
}

推荐阅读