0

私は PreferenceFragments の使用に苦労しています。うまくいかないようです。

内部値を保存するために、at.package.preferences (GUI なし) という名前の設定ファイルが 1 つあります。これは機能します。

ここで、ユーザーの他の (パブリック) 設定の設定画面を作成したくありませんが、ここで失敗します。私のコード:

    public class ChartPreferences extends Activity {

        private SharedPreferences prefs;
        private Button btn;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_chart_preferences);

            prefs = PreferenceManager.getDefaultSharedPreferences(this);

            btn = (Button) findViewById(R.id.button1);

            getFragmentManager().beginTransaction().replace(R.id.prefs_chart_content, 
            new ChartPrefsFragment()).commit();

            btn.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    Toast.makeText(ChartPreferences.this, getLineSize(), Toast.LENGTH_SHORT).show();                
                }
            });

        }

        public int getLineSize()
        {

            return Integer.valueOf(prefs.getString(getString(R.string.line_size_key), Helper.PREF_DEFAULT_LINE_SIZE));
        }

        public static class ChartPrefsFragment extends PreferenceFragment
        {
            @Override
            public void onCreate(Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                super.onCreate(savedInstanceState);
                addPreferencesFromResource(R.xml.chart_prefs);  
            }           

        }
    }

設定画面が表示され、値を選択すると、設定リストから 5 としましょう。これも問題ありません。設定リストを再度開くと、5がまだ選択されています(したがって、設定が保存されます-どこかに...)

保存された値にアクセスしようとすると、 getLineSize() 関数で問題が発生します。それは私に android.content.res.Resources$NotFoundException を与えます。

PreferenceScreen の値が保存される場所はわかりませんが、defaultSharedPreferences にはないようです (?)

念のため、chart_prefs.xml を次に示します。

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
  xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory android:title="@string/chart" android:summary="@string/chart">
        <ListPreference android:entries="@array/prefs_line_size" android:title="@string/line_size" android:summary="@string/line_size" android:key="@string/line_size_key" android:entryValues="@array/prefs_line_size"/>
    </PreferenceCategory>

</PreferenceScreen>
4

1 に答える 1

0

android:key="@string/line_size_key" を使用しているのはかなり奇妙に思えます。つまり、設定の名前はリソース ルックアップです。Preference のコードは見ていませんが、おそらく文字列を解決せず、設定が保存されるトークンとして '@string/line_size_key' を使用しているだけです。

あなたの好みの名前がリソースルックアップになることを本当に望んでいませんか? これは、ユーザーがデバイスで言語を変更すると、設定が消えることを意味します。

于 2013-01-22T08:29:46.460 に答える