【问题标题】:android - how to use listeners in settings activity (preferences) with kotlinandroid - 如何在 kotlin 的设置活动(首选项)中使用监听器
【发布时间】:2020-11-06 21:18:58
【问题描述】:

我没有 java/kotlin/android 背景,并且已经尝试学习了一个星期。我卡在 Settings Activity Listeners

我使用 New > Activity > Settings Activity 创建了一个 Settings Activity,并添加了一个 SeekBar

但无论我尝试了什么,我都无法使 println("triggered") 部分工作

我做错了什么?解释的时候别忘了我是新手

谢谢

PS:API 级别为 21

SettingsActivity.kt

import android.os.Bundle
import android.text.InputType
import android.view.inputmethod.EditorInfo
import android.widget.EditText
import android.widget.SeekBar
import androidx.appcompat.app.AppCompatActivity
import androidx.preference.EditTextPreference
import androidx.preference.PreferenceFragmentCompat


class SettingsActivity2 : AppCompatActivity(), SeekBar.OnSeekBarChangeListener, EditTextPreference.OnBindEditTextListener {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.settings_activity)
        if (savedInstanceState == null) {
            supportFragmentManager
                .beginTransaction()
                .replace(R.id.settings, SettingsFragment())
                .commit()
        }
        supportActionBar?.setDisplayHomeAsUpEnabled(true)
    }

    class SettingsFragment : PreferenceFragmentCompat() {
        override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
            setPreferencesFromResource(R.xml.root_preferences, rootKey)
        }
    }

    override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
        println("triggered1")
    }

    override fun onStartTrackingTouch(seekBar: SeekBar?) {
        println("triggered2")
    }

    override fun onStopTrackingTouch(seekBar: SeekBar?) {
        println("triggered3")
    }

    override fun onBindEditText(editText: EditText) {
        println("triggered4")
    }
}

root_preferences.xml

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <PreferenceCategory app:title="@string/messages_header">

        <EditTextPreference
            app:key="signature"
            app:title="@string/signature_title"
            app:useSimpleSummaryProvider="true" />

        <ListPreference
            app:defaultValue="reply"
            app:entries="@array/reply_entries"
            app:entryValues="@array/reply_values"
            app:key="reply"
            app:title="@string/reply_title"
            app:useSimpleSummaryProvider="true" />
        <SeekBarPreference
            android:key="seekbar_preference"
            android:title="Brightness"
            android:summary="@string/value_percentage"
            android:progress="0"
            app:showSeekBarValue="true" />

    </PreferenceCategory>

    <PreferenceCategory app:title="@string/sync_header">

        <SwitchPreferenceCompat
            app:key="sync"
            app:title="@string/sync_title" />

        <SwitchPreferenceCompat
            app:dependency="sync"
            app:key="attachment"
            app:summaryOff="@string/attachment_summary_off"
            app:summaryOn="@string/attachment_summary_on"
            app:title="@string/attachment_title" />

    </PreferenceCategory>

</PreferenceScreen>

【问题讨论】:

  • 由于是SettingsFragment 具有SeekbarSettingsFragment 是实现SeekBar.OnSeekBarChangeListener 并具有seekbar.setOnSeekBarChangeListener(this) 的那个,而不是SettingsActivity2
  • @Onik 抱歉回复晚了。在root_preferences 中你不能添加id 所以我不能使用findViewById 来获取seekbar。还有其他方法可以访问首选项中的对象吗?好像我错过了什么
  • 尚未使用首选项屏幕布局自定义,但根据How to add a button to PreferenceScreen 似乎是可能的。

标签: android kotlin android-preferences


【解决方案1】:

你必须使用OnPreferenceChangeListener

例子

val seekbarPreference: SeekBarPreference? = findPreference("seekbar_preference")
seekbarPreference!!.onPreferenceChangeListener =
    Preference.OnPreferenceChangeListener { preference, newValue ->
         println("triggered1")
        true
    }

【讨论】:

    猜你喜欢
    • 2020-06-26
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 2019-06-16
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多