Как обрабатывать нажатия на пункт настроек в SettingsFragment?
Создал SettingsActivity с помощью соответствующей опции в Android Studio. В мануалах гугла нашел, что вложенные экраны настроек следует делать фрагментами. Реализовал все так: SettingsActivity:
class SettingsActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_settings)
if (savedInstanceState == null) {
supportFragmentManager
.beginTransaction()
.replace(R.id.settings, SettingsFragment())
.commit()
}
supportActionBar?.setDisplayHomeAsUpEnabled(true)
}
override fun onSupportNavigateUp(): Boolean {
if (supportFragmentManager.popBackStackImmediate()) {
return true
}
return super.onSupportNavigateUp()
}
class SettingsFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.root_preferences, rootKey)
}
//это работает
override fun onPreferenceTreeClick(preference: Preference?): Boolean {
when (preference?.title) {
resources.getString(R.string.hidden_notes) -> {
val intent = Intent(activity, HiddenNotesActivity::class.java)
startActivity(intent)
}
}
return super.onPreferenceTreeClick(preference)
}
}
class PasswordSettingsFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.password_settings, rootKey)
}
// а вот это - нет
override fun onPreferenceTreeClick(preference: Preference?): Boolean {
when (preference?.title) {
resources.getString(R.string.import_from_file) -> {
val intent = Intent(activity, FileExplorerActivity::class.java)
startActivity(intent)
}
}
return super.onPreferenceTreeClick(preference)
}
}
}
Главный его xml:
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
<PreferenceScreen
app:title="@string/hidden_notes"
app:key="hidden_notes" />
<Preference
app:title="@string/password"
app:fragment="com.notes.k.SettingsActivity$PasswordSettingsFragment" />
</PreferenceScreen>
Итак, к проблеме. Нажатия на пункты в главном меню настроек(SettingsFragment в коде ниже) обрабатываю с помощью onPreferenceTreeClick. Это работает. А вот такой же фокус в следующем фрагменте не прокатывает. Очевидно, что с такой реализацией запуска фрагмента через xml он не умеет обрабатывать нажатия. Плюс ко всему он показывает, что вложенный фрагмент вообще нигде не используется(но это баг Android Studio, он не умеет видеть использование фрагмента из xml). Что посоветуете, народ? Или стоит отказаться от реализации запуска с помощью app:fragment из xml?
Ответы (1 шт):
Насчет отказываться или нет - решать только вам. А вот для кликов внутри фрагментов всегда использовал код ниже. То есть ищем нашу настройку по ключу, проверяем если она не null тогда добавляем OnPreferenceClickListener
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val preference: Preference? = findPreference("key")
preference?.setOnPreferenceClickListener {
//your code
true
}
}