SharedPreferences настройки приложения

143
25 декабря 2019, 16:40

Как организовать в настройках приложения функцию скрыть/показать textview. Пытался с помощью SharedPreferences, но так и понял.

Как вписывать в файл настроек? Как читать из файла?

Файл настроек:

public class setting1 extends PreferenceFragment {

public void onCreate (Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.pref_notification);
}

}

xml:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<SwitchPreference
    android:key="hidetext"
    android:summaryOff="Перевод выключен"
    android:summaryOn="Перевод включен"
    android:title="@string/pref_title_new_message_notifications"
    />

Answer 1

Вот примерный каркас, как контролировать изменения в настройках:

Делаете класс настроек:

public class AppSettings extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.settings);
        }

    public static class PrefsFragment extends PreferenceFragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.pref);
        }
    }
}

разметка settings.xml (путь до фрагмента в атрибуте android:name у вас будет свой в зависимости от пакетов):

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    <fragment
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:name="com.example.app.AppSettings$PrefsFragment"
        android:id="@+id/pref_fragment" />
</FrameLayout>

Сам XML настроек с чекбоксом pref.xml помещаем в папку res/xml (ключ настройки указываем hide_text):

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory
        android:title="@string/tittle_settings">
        <CheckBoxPreference
            android:title="@string/show_hidden_text"
            android:defaultValue="false"
            android:key="hide_text" />
    </PreferenceCategory>
</PreferenceScreen>

В меню приложения делаете пункт "Настройки", который будет вызывать активити AppSettings (этого нет в коде ответа, так как не относится к вопросу)

Код для контроля за состоянием этой настройки в той активити, в которой используется какая то настройка (в вашем случае, где нужно скрывать\показывать текст):

public class SomeActivity extends AppCompatActivity implements SharedPreferences.OnSharedPreferenceChangeListener{
    private SharedPreferences mPreference;
    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity);
        textView = findViewById(R.id.textView);
        // получаем экземпляр настроек
        mPreference = PreferenceManager.getDefaultSharedPreferences(this);
        // регистрируем слушатель
        mPreference.registerOnSharedPreferenceChangeListener(this);
        // Устанавливаем актуальное состояние настройки при создании активити
        boolean isHide = mPreference.getBoolean("hide_text", false);
        textView.setVisibility(isHide ? View.GONE : View.VISIBLE); 
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        // отписываемся от слушателя
        mPreference.unregisterOnSharedPreferenceChangeListener(this);
    }
    // этот метод сработает, когда в любом ключе настроек произойдут изменения значения
    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
       // проверяем изменилось ли значение нашего ключа hide_text
       if (key.equals("hide_text")) {
            // если изменилось - вносим эти изменения
            boolean isHide = mPreference.getBoolean("hide_text", false);
            textView.setVisibility(isHide ? View.GONE : View.VISIBLE); 
       };
    }
}

Записывать новые значения или размещать какие то чекбоксы на разметке никуда не нужно, это произойдет автоматически при изменении чекбокса в настройках, а сам чекбокс уже задан в xml-файле pref.xml.

Все это будет работать следующим образом. При первом старте у вас будет показываться текст в TextView (значение настройки по умолчанию - false)/ Если надо изменить видимость текста, вы вызываете меню приложения и выбираете пункт "Настройки", там переключаете чекбокс и после выхода из настроек и возвата на активити с TextView, текст в ней будет скрыт или показан, в зависимости от состояния чекбокса в настройках.

READ ALSO
Почему приложение вылетает [закрыт]

Почему приложение вылетает [закрыт]

Хотите улучшить этот вопрос? Update the question so it's on-topic for Stack Overflow на русском

151
Оптимизировать код методов Java

Оптимизировать код методов Java

Есть такая задача: найти максимальную последовательность единиц в матрицеПоследовательность может быть как горизонтальной так и вертикальной

118
Для чего сравнивать this и любой Object o?

Для чего сравнивать this и любой Object o?

Для чего сравнивать this, и любой Object o? В каких случая они могут оказаться равными?

121
Как скрыть метод класса Java?

Как скрыть метод класса Java?

Собственно, как скрыть/сделать не доступными некоторые методы класса? Например, перезаписанные public методы класса-родителя:

136