2017-03-26 8 views
1

私が解決できない問題のテストを簡単にするために、ユーザーがListPreferenceの値を変更したときにリスナーが呼び出されないのはなぜですか?値は、アプリケーションを再実行して見られるように変更されます。ListPreferenceが値を変更したときにSharedPreferences.OnSharedPreferenceChangeListenerが呼び出されない

preferences.xmlは単純です:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 

    <ListPreference 
     android:title="list preference" 
     android:key="@string/pref_list" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:persistent="true" 
     android:entryValues="@array/all_blah" 
     android:entries="@array/all_blah" 
     android:summary="%s" /> 

</PreferenceScreen> 

それは私のstrings.xml

<string-array name="all_blah"> 
    <item>blah 1</item> 
    <item>blah 2</item> 
    <item>blah 3</item> 
    <item>blah 4</item> 
</string-array> 
<string name="pref_list">pref_list</string> 
<string name="pref_file">SharedPrefFile</string> 

に次のエントリを参照MainActivity非常に簡単です:

package com.acme.settingstest; 

import android.content.Intent; 
import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 

class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent modifySettings=new Intent(MainActivity.this, SettingsActivity.class); 
       startActivity(modifySettings); 
      } 
     }); 
    } 
} 

そして最後に、SettingsActivityこれは:

package com.acme.settingstest; 

import android.content.Context; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.preference.PreferenceFragment; 
import android.support.annotation.Nullable; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 

class SettingsActivity extends AppCompatActivity { 

    SharedPreferences mPrefs = null; 
    private static final String TAG = "SettingsActivity"; 

    private final SharedPreferences.OnSharedPreferenceChangeListener mListener = 
      new SharedPreferences.OnSharedPreferenceChangeListener() { 
       public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
        if (key.equals(getString(R.string.pref_list))) { 
         Log.e(TAG, "caught change in pref_list"); 
        } 
       } 

      }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mPrefs = getSharedPreferences(getString(R.string.pref_file), Context.MODE_PRIVATE); 
     getFragmentManager() 
       .beginTransaction() 
       .replace(android.R.id.content, new SettingsFragment()) 
       .commit(); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     mPrefs.unregisterOnSharedPreferenceChangeListener(mListener); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     mPrefs.registerOnSharedPreferenceChangeListener(mListener); 
    } 

    public static class SettingsFragment extends PreferenceFragment { 

     @Override 
     public void onCreate(@Nullable final Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      addPreferencesFromResource(R.xml.preferences); 
     } 
    } 
} 
+0

if文は本当にありますか? –

+1

私はそれを疑う理由を見ることができません。ある? – levengli

+0

if文の前に端末に記録します。条件文が動作していないかOnSharedPrefChangeListenerであるかを理解できません –

答えて

2

あなたはSettingsActivityでデフォルト以外の設定を使用していますが、共有環境設定で使用するPreferenceManagerを指定していません。

OnSharedPreferenceChangeListenerはSharedPreferences - SharedPrefFileに登録されていますが、これはデフォルトではありません。

環境設定を追加する前にOnCreateのSettingsFragmentでSharedPreferencesNameを設定してみてください。次のようなもの:

PreferenceManager prefMgr = getPreferenceManager(); 
prefMgr.setSharedPreferencesName(getString(R.string.pref_file)); 
prefMgr.setSharedPreferencesMode(MODE_WORLD_READABLE); 
+0

なぜモードは 'MODE_PRIVATE'ではなく' MODE_WORLD_READABLE'に設定されていますか? – levengli

+0

これは 'MODE_PRIVATE'でもかまいません。これはあなたのユースケースの理解と適応に役立つ例です。 –

+0

per http://stackoverflow.com/questions/15706179/getpreferencemanager-deprecated、' getPreferenceManager() 'は推奨されていません。別の方法がありますか? – levengli

関連する問題