2016-12-24 49 views
0

我收到编译器错误无法解析方法findPreference当我尝试初始化我的MainActivity中的OnSharedPreferencesChanged侦听器。根据答案here无法从MainActivity解析findPreference()?

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是这既是PreferenceFragmentPreferenceActivity的一部分的方法 - 这些都是碎片/活动,实际上显示您的偏好屏幕(活动已被废弃,你应该使用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的实际UI,以便在使用列表首选项时,例如,如果您选择三个值中的一个,它将显示您在屏幕上刚选择的值。