Android включенные настройки отображаются серым цветом - PullRequest
0 голосов
/ 22 января 2020

Попытка создать Android настроек с настройками, которые некоторые из них открывают новый диалог Activity / custom с OnPreferenceClickListener. Все работает нормально, но проблема в том, что на реальном устройстве случайные настройки имеют серый цвет, как будто они отключены. Я не могу найти шаблон, почему это происходит, но это происходит только с чистым классом Preference. EditTextPreferences и другие не имеют такого рода проблемы. Вот пример с некоторым кодом.

    <PreferenceCategory
        app:title="@string/extra"
        app:key="annots">

        <Preference
            app:key="annot"
            app:title="@string/pref_annotation" />

        <Preference
            app:key="reset"
            app:title="@string/reset_extra" />
    </PreferenceCategory>

    <PreferenceCategory
        app:title="@string/app"
        app:key="version_android">

        <Preference
            app:key="about_app"
            app:title="@string/third_party"/>

        <Preference
            app:key="show_web"
            app:title="@string/website"/>

        <Preference
            app:key="pref_about_build"
            app:persistent="false"
            app:selectable="false"
            app:title="@string/build_version" />
    </PreferenceCategory>

Всего Java код:

public class SettingsActivity extends AppCompatActivity {


    Context context;
    public final static String GPS_DIS = "GPS_distance", GPS_TIME = "GPS_time", FILESIZE = "file_size", SAMPLING = "sampling_frequency", SAMPLING_WEAR = "sampling_frequency_wear";

    public final static  String FREE_MEMORY_PHONE_TO_SAVE = "free_memory_phone", FREE_MEMORY_WEAR_TO_SAVE = "free_memory_wear";
    public final static  String ACTIVITY_RECOGNITION_INTERVAL = "activity_recognition_refresh";
    private final static String AVAILABLE_MEMORY = "available_memory";
    public final static String AVAILABLE_MEMORY_WEAR = "available_memory_wear";


    private static int getDelay(int rate) {
        int delay = 0;
        switch (rate) {
            case SENSOR_DELAY_FASTEST:
                break;
            case SENSOR_DELAY_GAME:
                delay = 20000;
                break;
            case SENSOR_DELAY_UI:
                delay = 66667;
                break;
            case SENSOR_DELAY_NORMAL:
                delay = 200000;
                break;
        }
        return delay;
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {


        super.onCreate(savedInstanceState);
        setTitle(getString(R.string.settings));
        context = this;
        setContentView(R.layout.activity_settings);

        getSupportFragmentManager().beginTransaction()
                .replace(R.id.settings_container, new PreferencesFragmentNew())
                .commit();

        if(getSupportActionBar() != null){
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setDisplayShowHomeEnabled(true);
        }
    }

    @Override
    public boolean onSupportNavigateUp() {
        onBackPressed();
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        finish();
        startActivity(new Intent(this, Main.class));
        return true;

    }

    public static class PreferencesFragmentNew extends PreferenceFragmentCompat {

        private ArrayList<String> setDigits = new ArrayList<String>(){{
            add(GPS_DIS);
            add(GPS_TIME);
            add(FILESIZE);
            add(ACTIVITY_RECOGNITION_INTERVAL);
            add(FREE_MEMORY_PHONE_TO_SAVE);
            add(FREE_MEMORY_WEAR_TO_SAVE);
        }};


        @Override
        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
            setPreferencesFromResource(R.xml.prefs, rootKey);
            SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(Objects.requireNonNull(getActivity()));


            findPreference(SAMPLING).setSummary(getDelay(preferences.getInt(SAMPLING, 0)) +" μs");
            findPreference(SAMPLING).setOnPreferenceClickListener(preference -> {
                DialogsOther.infoDialog(getContext(), DialogsOther.SAMPLING);
                return true;
            });


            findPreference(SAMPLING_WEAR).setSummary(getDelay(preferences.getInt(SAMPLING_WEAR, 2)) +" μs");
            findPreference(SAMPLING_WEAR).setOnPreferenceClickListener(preference -> {
                DialogsOther.infoDialog(getContext(), DialogsOther.SAMPLING_WEAR);
                return true;
            });

            findPreference(AVAILABLE_MEMORY).setSummary(Memory.getFreeMemoryString());

            String memoryWear = preferences.getString(AVAILABLE_MEMORY, "");
            if(memoryWear.equals("")){
                findPreference(AVAILABLE_MEMORY_WEAR).setSummary(getContext().getString(R.string.unknown));
            }else{
                findPreference(AVAILABLE_MEMORY_WEAR).setSummary(getContext().getString(R.string.last_known)+" "+memoryWear+" MB");
            }

            for(String s : setDigits){
                EditTextPreference editTextPreference = findPreference(s);

                if(editTextPreference != null) {
                    editTextPreference.setOnBindEditTextListener(editText -> editText.setInputType(InputType.TYPE_CLASS_NUMBER));
                }

                SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
                editTextPreference.setSummary(sharedPreferences.getString(s, ""));
            }

            // resetting to default values - annotations
            findPreference("reset").setOnPreferenceClickListener(preference -> getContext().sendBroadcast(new Intent(Main.RESET_STATS)));



            Preference pref = findPreference("activity_recognition_refresh");
            pref.setOnPreferenceChangeListener((preference, newValue) -> {
                preference.setSummary(newValue + " s");
                return true;
            });

            findPreference("activity_recognition_about").setOnPreferenceClickListener(preference -> {
                DialogsOther.infoDialog(getContext(), R.string.title_activity_recognition,
                        R.string.about_activity_recognition_text).show();
                return true;
            });

            findPreference("about_app").setOnPreferenceClickListener(preference -> {
                startActivity(new Intent(getActivity(), AboutApp.class));
                return true;
            });

            findPreference("annot").setOnPreferenceClickListener(preference -> {
                startActivity(new Intent(getActivity(), AnnotationActivitySet.class));
                return true;
            });

            findPreference("show_web").setOnPreferenceClickListener(preference -> {
                Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("..."));
                startActivity(browserIntent);
                return true;
            });
            findPreference("pref_about_build").setSummary(BuildConfig.VERSION_NAME);
        }
    }

    @Override
    public void onBackPressed() {
        finish();
        startActivity(new Intent(this, Main.class));
    }
}

Последний должен быть серого цвета, но это происходит, и каждый раз, когда это случайно:

image

Я пытался изменить стили предпочтений, их цвета, включить их программно, пробовал несколько телефонов с разными версиями Android. Любое предложение / быстрое решение? Или я должен создать собственную реализацию.

...