3

EditTextPreferenceアイテムを含む設定フラグメントがあります。プリファレンスフラグメントをロードするたびに、表示される値はデフォルト値であり、sharedPreferencesに保存されている値の1つです。メニューが読み込まれたときに、これらの編集テキストを常にsharedPreferencesからのテキストを表示するようにするにはどうすればよいですか?以下を使用して、フラグメントからsharedPreferencesにアクセスしてみました。

SharedPreferences def = getActivity().getPreferences(0);
Log.v("Something", def.getString("relay1_name", "no"));

しかし、任意のキーにアクセスしようとすると、デフォルトのテキストが返されます。テキスト入力はsharedPreferencesに保存されています。これは、editTextをクリックすると、事前に設定したテキストがすでに存在しているため、要約だけにデフォルトのテキストが表示されるためです。よろしくお願いします。私はおそらく非常に単純なものを見逃しているでしょう。

設定画面のxml

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory

    android:title="@string/prefs_relay_title">
    <EditTextPreference
        android:dialogTitle="Relay1"
        android:key="relay1_name"
        android:summary="Relay 1"
        android:title="Relay 1"
        android:defaultValue="Relay 1" />

</PreferenceCategory>
</PreferenceScreen>

フラグメントが作成されるアクションpublicclassPrefsActivity extends Activity {

public static final String PREFS_NAME = "prefs";

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

    getFragmentManager().beginTransaction().replace(android.R.id.content, new PrefsFragment()).commit();    // Load the prefs screen up 
 }
}

prefsフラグメント自体

public class PrefsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener {

//public static final String PREFS_NAME = "prefs";

@Override
public void onCreate(Bundle savedInstanceState) {

    Log.v("PrefsFragment", "Creating prefs fragment");

    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.prefs_xml);

    getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);

}

void loadDefaults() {

    SharedPreferences def = getActivity().getPreferences(0);
    Log.v("Something", def.getString("relay1_name", "no"));

}

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {

    if (key.equals("relay1_name")){
        Preference connectionPref = findPreference(key);
        connectionPref.setSummary(sharedPreferences.getString(key, ""));

}

@Override
public void onResume() {
    super.onResume();
    getPreferenceScreen().getSharedPreferences()
            .registerOnSharedPreferenceChangeListener(this);
}

@Override
public void onPause() {
    super.onPause();
    getPreferenceScreen().getSharedPreferences()
            .unregisterOnSharedPreferenceChangeListener(this);
}

}
4

1 に答える 1

1

PreferenceScreenフラグメントが使用している間、アプリケーションのデフォルトの共有設定を使用すると思いますgetActivity().getPreferences()

アクティビティのドキュメントを見るとgetPreferences()、アプリケーションの共有設定ではなく、特定のアクティビティにプライベートな設定が取得されます。これは、によって保存されたものと同じではないと思いますPreferenceScreen

交換することをお勧めします

SharedPreferences def = getActivity().getPreferences(0);

SharedPreferences def = PreferenceManager.getDefaultSharedPreferences();

それが役立つかどうかを確認します。

于 2012-10-15T16:33:07.410 に答える