0

我正在学习如何在 android 应用程序中设置首选项。我有一个文件 res/xml/prefs.xml,其中包含一些不同的组件(?)。这由 Prefs.java 引用,它addPreferencesFromResource(R.xml.prefs);在其onCreate()方法中使用。据我了解,prefs.xml 文件设置首选项,而 Prefs.java 文件访问 prefs.xml 以提供逻辑(然后我将对其进行编程)。
然后在我的清单中,我有一项活动作为

<activity
    android:name=".Prefs"
    android:label="Preferences" >
    <intent-filter>
        <action android:name="com.example.lesson1.PREFS" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

不太确定 Manifest 是否引用 Prefs.java 或者是否相反或什么。
此外(目前最令人困惑的),我还有另一个名为 Splash.java 的文件,它显示一个启动屏幕。在初始屏幕上onCreate(),它执行以下操作:

    MediaPlayer ourSong = MediaPlayer.create(Splash.this, R.raw.splash);
    SharedPreferences getPrefs = PreferenceManager
            .getDefaultSharedPreferences(getBaseContext()); 
    boolean music = getPrefs.getBoolean("checkbox", true);
    if (music) {
        ourSong.start();
    }

我不确定这如何知道偏好(其中任何一个,或者它引用的任何一个)在哪里。我从来没有告诉它 prefs.xml 是首选项文件,或者它在哪里。那么这是首选项所在的默认设置res/xml/prefs.xml并且它自动知道吗?
我只是对事情的整个顺序感到非常困惑。哪个文件引用哪个?清单如何在这里发挥作用(似乎它只是指向 .java 文件来告诉 android 应用程序它在那里,但我真的不知道)。最后,是否可以声明首选项位于不同的 .java 和 .xml 文件中,还是必须将它们称为 prefs.java/.xml?
谢谢,对不起,如果这令人困惑。我自己很困惑,无法真正判断我在这里是否完全有意义。

4

1 回答 1

0

当你的应用程序被编译时,res 文件夹中的各种东西都会被编译进去。在这种情况下,xml 文件夹被识别为原始文件夹并被R.xml.prefs添加到自动生成的代码中。

在运行时,这被视为原始资源并读入数据(它实际上是使用充气机构建的,类似于布局充气机的工作方式)。您实际上可以自己查看数据,使用...

InputStream is = context.getResources().openRawResource(R.xml.prefs);

因此,在运行时,addPreferencesFromResource(R.xml.prefs)足以加载首选项。

至于访问首选项,首选项存储在 SharedPreferences 中。我假设您有一个名为“复选框”的首选项,因此当您调用getPrefs.getBoolean("checkbox", true)它时,它会查找该 SharedPreference 值,如果未找到(因为尚未设置首选项),那么它会返回true(第二个参数)。

这就是为什么在你的默认值中保持一致对你来说非常重要。实际上可能值得拥有一个专门用于与首选项交互的类,这样您就不会意外地在不同的地方默认为不同的值。

res 文件夹中有很多自动生成的魔法。例如,每个人都使用res/values/strings.xml来存储他们的字符串,但实际上文件名是什么并不重要。读取和合并其中的任何内容res/values/,每个文件都可以是各种数据类型(字符串、整数、颜色等)的混合体。

于 2012-07-12T04:30:14.530 回答