0

Я получаю ошибку компилятора не может разрешить метод findPreference, когда я пытаюсь инициализировать прослушиватель OnSharedPreferencesChanged в моей MainActivity. Согласно ответу here:Не удается разрешить findPreference() из MainActivity?

findPreference() должен быть вызван из класса, реализующего интерфейс PreferenceActivity

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

MainActivity.java

public class MainActivity extends FragmentActivity implements SharedPreferences.OnSharedPreferenceChangeListener { 
     private SharedPreferences.OnSharedPreferenceChangeListener listener; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      ... 
      //Test preference menu 
      listener = new SharedPreferences.OnSharedPreferenceChangeListener() { 
       public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { 
        if (key.equals("pref_wood")) { 
         Preference woodPref = findPreference(key); //COMPILER ERROR HERE 
         MainActivity.getGLSurfaceView().setTexture(""); 
         // Set summary to be the user-description for the selected value 
         woodPref.setSummary(sharedPreferences.getString(key, "")); 
        } 
       } 
      } 
     } 
    } 

ответ

5

findPreference это метод, который является частью как PreferenceFragment и PreferenceActivity - это фрагменты/Действия, которые действительно показывают ваши предпочтения экрана (деятельность является устаревшей, и вы должны быть используя PreferenceFragment).

Вы пытаетесь использовать его в своем MainActivity. Это не работает, потому что объекты Preference фактически не существуют на этом экране (они существуют в другом действии, которое обычно имеет PreferenceFragment как часть его). Если вам необходимо получить доступ к значению предпочтения предпочтения в деятельности, которая не является экран предпочтений, использовать SharedPreferences, что-то вроде:

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); 
int defaultValue = getResources().getBoolean(R.bool.saved_high_score_default); 
boolean wood = sharedPref.getBoolean(pref_wood, defaultValue); 

Вы можете проверить documentation для дальнейших примеров.

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

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