Intereting Posts
Обратный вызов Ble scan вызывает только несколько раз, а затем останавливается Как создать значок строки состояния с правой стороны? (Android) Сделайте интерактивные полигоны на Картах Google (для Android) Google Maps V2 – Android – Получить текущий уровень масштабирования Привязать к сервису из нового контекста для изменения конфигурации или привязки из контекста приложения? Ошибка Android Studio JUNIT4 !!! Ожидается, что версия JUnit версии 3.8 или более поздней версии: Добавить поля для разделителя в RecyclerView Android Studio – Может ли использовать код с другими вкусами? Android Milliseconds с точки зрения времени Векторная графика, используемая для маркера карты Google Drawable to Bitmap, Drawable неизвестный размер / размер Ошибка Entity возвращает в MultiPartEntityBuilder Android – Изменить цвет темы темы Holo по умолчанию Android – onCreateDialog вылетает при возвращении DatePickerDialog Блокировка / разблокировка экрана Android программно

Как обновить PreferenceActivity, чтобы показать изменения в настройках?

На основании следующего кода вы можете рассказать мне, как обновить окно PreferenceActivity, чтобы немедленно просмотреть изменения в настройках? Например: пользователь переключает флажок перехвата мастер-звонка на true (отмечен), я хотел бы, чтобы пользователь сразу же увидел, что другие настройки, такие как флажок ChimeOn15Past, также будут true (отмечены галочкой)

SharedPreferences.Editor prefEditor = clockSettings.edit(); // Allow the settings to be changed. if (booleanMasterChimeToggle == true) { prefEditor.putBoolean("ChimeOnTheHour", true); prefEditor.putBoolean("ChimeOn15Past", true); prefEditor.putBoolean("ChimeOn30Past", true); prefEditor.putBoolean("ChimeOn45Past", true); strNotifyMessage = "Full chiming has now been set."; } else { prefEditor.putBoolean("ChimeOnTheHour", false); prefEditor.putBoolean("ChimeOn15Past", false); prefEditor.putBoolean("ChimeOn30Past", false); prefEditor.putBoolean("ChimeOn45Past", false); strNotifyMessage = "Full chiming has now been disabled."; } 

Ответ Николая правильный. Я просто хочу добавить здесь код, чтобы более четко проиллюстрировать его точку зрения.

 private CheckBoxPreference mOn15Past; private CheckBoxPreference mOn30Past; private CheckBoxPreference mOn45Past; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Load the preferences from an XML resource addPreferencesFromResource(R.xml.preferences); mOn15Past = (CheckBoxPreference) findPreference("ChimeOn15Past"); mOn30Past = (CheckBoxPreference) findPreference("ChimeOn30Past"); mOn45Past = (CheckBoxPreference) findPreference("ChimeOn45Past"); final Preference chimeMaster = findPreference("ChimeMaster"); chimeMaster.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newVal) { final boolean value = (Boolean) newVal; mOn15Past.setChecked(value); mOn30Past.setChecked(value); mOn45Past.setChecked(value); return true; } }); } 

Короче говоря, PreferenceActivity не предназначен для обновления своих значений из постоянного хранилища после его запуска. Вместо использования SharedPreferences.Editor для изменения и фиксации дополнительных изменений, как в вашем коде, лучше внести изменения в локальный объект PreferenceManager который будет передан PreferenceActivity в его нормальном жизненном цикле.

Вместо

 finish(); startActivity(getIntent()); 

Я предпочитаю следующий код:

 setPreferenceScreen(null); addPreferencesFromResource(R.xml.preferences); 

Это также приведет к сбросу дисплея, но без всей процедуры завершения и ее последствий. Плюс этот код хорошо работает с PreferenceActivity и PreferenceFragment .

Это интересно, если вы хотите динамически изменить значение языкового стандарта, например. В этом случае работать с менеджером недостаточно, потому что вам нужна полная перезагрузка названий и значений.

EDIT: setPreferenceScreen устарел в PreferenceActivity (все еще работает), но не в PreferenceFragment

Существует простой способ обновить все элементы в списке за один раз. Просто выполните следующие действия:

 getPreferenceScreen().removeAll(); addPreferencesFromResource(R.xml.preferences); 

При таком подходе вы не потеряете позицию ListView.

Реализовать onPreferenceChange и переключить связанные с ним функции. Чтобы «обновить» всю активность, вам нужно finish() и перезапустить ее.

После борьбы с этим в течение дня я понял это.
Это для нескольких уровней предпочтений.

Parent – это экран предпочтений, который содержит предпочтение, которое вы пытаетесь обновить.

Поскольку экран настроек отображается в виде диалогового окна, вы можете получить список из диалогового окна, а затем сообщить его адаптеру для обновления дочернего элемента .

 PreferenceScreen parent // The screen holding the child PreferenceScreen child // The entry changing child.setSummary(isEnabled?"Enabled":"Not Enabled"); ListView v = (ListView)parent.getDialog().findViewById(android.R.id.list); BaseAdapter ba = (BaseAdapter)v.getAdapter(); ba.notifyDataSetChanged(); 

Я обнаружил, что R.id.list недоступен на старых телефонах, но это работает

  ListAdapter adapter = parent.getRootAdapter(); if (adapter instanceof BaseAdapter) { ((BaseAdapter)adapter).notifyDataSetChanged(); } 

Вы можете просто вызвать метод onCreate. Если вы хотите, вы можете вызвать методы onStart и onResume.

 onCreate(null); 

Я решил эту проблему таким образом.

Этот класс указывает простой экран предпочтений. Что может вам помочь.

 public class PreferenceActivitySettings extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener { private SharedPreferences preferences; @SuppressWarnings("deprecation") @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.settings); preferences = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); preferences.registerOnSharedPreferenceChangeListener(this); } @SuppressWarnings("deprecation") @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { setPreferenceScreen(null); addPreferencesFromResource(R.xml.settings); } } 

Мне удалось написать метод, который на самом деле прост и без необходимости отменять ListViews или, что бы там ни было. Этот метод делает вызов public ViewGroup removeView(View view) , View requestLayout() , View forceLayout() , ViewGroup addView(View view) и, наконец, вызов методов Fragment OnCreate(Bundle savedInstanceState) с несколькими нулевыми проверками и final View временной переменной для сохранения фактического представления при удалении представления.

Этот метод все еще довольно новый, и я буду давать ему некоторые настройки и уточнения в течение следующих 2 дней, но он работает безупречно, как без побочных эффектов. Поскольку класс, который я написал, содержащий код, меняет фактический стиль заголовка и сводные стили текста для всего романа (в этом весь смысл добавляемых параметров), я также добавил публичный конструктор классов, которые Действия, которые лежат в стеке действий ниже экрана стиля предпочтения, чтобы они могли обновляться одновременно. Скорее всего, я переведу этот новый метод в класс представлений frameworks, чтобы он мог быть доступен для всей системы.

 public void reLoadView(View view) { if (view == null) { view = mView; Log.i(TAG, "The current View is: " + view); } final View tmpView = view; try { setStyleChanged(1); setReset(0); Log.i(TAG, "The Temporary View is: " + tmpView); Log.i(TAG, "The current View is: " + mView); Log.i(TAG, "The current ViewGroup is: " + mViewGroup); if (mView != null) { if (mViewGroup != null) { mActivity.runOnUiThread(new Runnable() { @Override public void run() { mViewGroup.removeView(mView); mView.requestLayout(); mView.forceLayout(); mViewGroup.addView(tmpView); onCreate(new Bundle()); } }); } } View tmp = null; mDemented.reLoadView(tmp); } catch (Exception e) { } } 

Сами переменные представления первоначально устанавливаются в инициализации класса и инициализируются и определяются в View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) и View onViewCreated(View view, Bundle savedInstanceState) . Сами переменные представления сначала устанавливаются в инициализации класса.

 private View mView; private ViewGroup mViewGroup; private int mLayoutResId = R.layout.preference_list_fragment;//holds the layout reference just to keep it clean @Override public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { View rootView = inflater.inflate(mLayoutResId, parent, false); mViewGroup = parent; return rootView; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { mView = view; } 

В действиях в стеке ниже, в классе PreferenceStyle, я устанавливаю пустой конструктор, который можно инициализировать в любом месте приложения.

 public class DEMENTED extends SettingsPreferenceFragment implements Preference.OnPreferenceChangeListener, View.OnClickListener { public DEMENTED() { super(); } //other code to do whatever here 

В моем классе PreferenceStyle я импортировал свой класс DEMENTED, а затем задал его как переменную до onCreate(Bundle savedInstanceState) :

 private DEMENTED mDemented; 

Затем инициализируется переменная в onCreate(Bundle savedInstanceState) :

 mDemented = new DEMENTED(); 

Вызов класса DEMENTED для перезагрузки его представления выполняется в моем reloadView(View view) но представление переменной, используемое для вызова, представляет собой переменную вида, установленную непосредственно перед вызовом, и устанавливается как null:

 View tmp = null; mDemented.reLoadView(tmp); 

И мой класс DEMENTED проверяет, является ли включенное представление в вызове метода нулевым, и если он устанавливает его в локализованную переменную View, чтобы метод мог выполнять свою работу с локальными переменными:

 public void reLoadView(View view) { if (view == null) { view = mView; Log.i(TAG, "The current View is: " + view); } //all the other good stuff here 

В принципе, это использует ViewGroup, как определено в onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) :

  mViewGroup = parent; 

И переменная View установлена ​​в onViewCreated(View view, Bundle savedInstanceState)

  mView = view; 

Надеюсь, это поможет кому-то, потому что это вопрос, который я неоднократно повторял здесь, и мне еще предстоит найти твердое решение в любом месте, где не было нескольких классов, используемых как utils. Если у кого-то есть предложения по комментариям, чтобы упростить или что-либо не стесняйтесь комментировать.

Если вы ориентируетесь на API 11 и выше, вы можете использовать invalidateHeaders .

Из документов:

Вызовите, когда вам нужно изменить отображаемые заголовки. Это приведет к тому, что onBuildHeaders () будет вызван для получения нового списка.