Попытка создать 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));
}
}
Последний должен быть серого цвета, но это происходит, и каждый раз, когда это случайно:
Я пытался изменить стили предпочтений, их цвета, включить их программно, пробовал несколько телефонов с разными версиями Android. Любое предложение / быстрое решение? Или я должен создать собственную реализацию.