Заполнитель набора AndroidX MultiSelectListPreference

У меня есть экран предпочтений, который использует API предпочтений AndroidX, и я использую MultiSelectListPreference, который динамически заполняет свои записи.

Из-за этого массив записей может быть пустым, и в этой ситуации я хочу показать текст типа «Ничего не найдено». В настоящее время я попытался установить текст заполнителя в качестве записи, и хотя технически это работает, он позволяет пользователю выбрать эту запись (флажок все еще появляется).

Любые идеи о том, как отобразить текст заполнителя, но убедиться, что флажок не отображается?

Спасибо

Как насчет отключения предпочтения? Это может помешать пользователям щелкнуть настройку в первую очередь, и вы можете снова включить ее после заполнения записей.

Edric 06.02.2019 14:54

Да, наконец, я реализовал это как отключение предпочтения и обновление его сводки с помощью заполнителя. Не стесняйтесь опубликовать это как ответ, чтобы я мог принять его.

fergaral 06.02.2019 22:00
0
2
417
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сначала отключить MultiSelectListPreference в XML-файле настроек, а затем включить его программно, используя Preference#setEnabled, как только значения будут установлены.

См. пример ниже:

pref_todo.xml:

<androidx.preference.PreferenceScreen
    xmlns:android = "http://schemas.android.com/apk/res/android"
    xmlns:app = "http://schemas.android.com/apk/res-auto"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent">

    <!-- ... -->

    <MultiSelectListPreference
      app:enabled = "false"
      app:title = "@string/pref_weekly_summary_title"
      app:summary = "@string/pref_weekly_summary_summary"
      app:key = "pref_weekly_summary" />

    <!-- ... -->
  </androidx.preference.PreferenceScreen>

Код фрагмента вашего предпочтения (Java):

import androidx.preference.PreferenceFragment;
import androidx.preference.MultiSelectListPreference;
// ...

public class TodoPreferenceFragment extends PreferenceFragmentCompat {
    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootkey) {
        setPreferencesFromResource(R.xml.pref_todo, rootKey);
        // Cast from a Preference to a MultiSelectListPreference
        MultiSelectListPreference weeklySummaryListPref = (MultiSelectListPreference) findPreference("pref_weekly_summary");

        // Set the entries
        weeklySummaryListPref.setEntries(new CharSequence[]{"Todos progress", "Todos completed"});
        weeklySummaryListPref.setEntryValues(new CharSequence[]{"todos_progress", "todos_completed"});

        // Lastly, reenable the preference
        weeklySummaryListPref.setEnabled(true);
    }
}

Код фрагмента вашего предпочтения (Kotlin w/Preference KTX):

import androidx.preference.PreferenceFragment
import androidx.preference.MultiSelectListPreference
// ...

class TodoPreferenceFragment: PreferenceFragmentCompat() {
    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.pref_todo, rootKey)
        // Cast from a Preference to a MultiSelectListPreference
        // Note: This syntax is only supported on AndroidX Preference versions 1.1.0-alpha02 and up
        val weeklySummaryListPref = findPreference<MultiSelectListPreference>("pref_weekly_summary")

        // Set the entries
        weeklySummaryListPref.entries = arrayOf("Todos progress", "Todos completed")
        weeklySummaryListPref.entryValues = arrayOf("todos_progress", "todos_completed")

        // Lastly, reenable the preference
        weeklySummaryListPref.enabled = true
    }
}

Другие вопросы по теме