如何在Android上创建首选项活动和首选项片段?

时间:2014-05-07 16:54:27

标签: android android-fragments android-activity android-xml android-preferences

当我关注旧教程(Créez des applications pour Android -> openclassroom)时,我从PreferenceActivity类中坚持使用这个已弃用的方法addPreferencesFromResource(int id)

所以我的问题是:

  

在Android中创建偏好设置的新方法是什么?

2 个答案:

答案 0 :(得分:96)

我发现这篇帖子(What to use instead of “addPreferencesFromResource” in a PreferenceActivity?)有助于我了解您必须通​​过PreferenceFragment才能完成此操作。

在以下说明中,我使用your.package.表示您必须输入包名称。每个人都有自己的包装,所以请用你的包裹替换它。

让我们开始:


1。偏好片段

  • 创建PreferenceFragment类

      

    MyPreferenceFragment

    public class MyPreferenceFragment extends PreferenceFragment
    {
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.fragment_preference);
        }
    }
    


  • 然后是关联的xml资源

      

    fragment_preference.xml (在项目的res / xml文件夹中)

    <?xml version="1.0" encoding="utf-8"?>
    
    <PreferenceScreen
        xmlns:android="http://schemas.android.com/apk/res/android">
    
        <PreferenceCategory 
            android:title="FOO">
    
            <CheckBoxPreference
                android:key="checkBoxPref"
                android:title="check it out"
                android:summary="click this little box"/>
    
        </PreferenceCategory>
    
    </PreferenceScreen>
    

    这是Fragment部分的全部内容。



2。偏好活动

  • 创建PreferenceActivity类

      

    MyPreferenceActivity

    public class MyPreferenceActivity extends PreferenceActivity
    {
        @Override
        public void onBuildHeaders(List<Header> target)
        {
            loadHeadersFromResource(R.xml.headers_preference, target);
        }
    
        @Override
        protected boolean isValidFragment(String fragmentName)
        {
            return MyPreferenceFragment.class.getName().equals(fragmentName);
        }
    }
    

    不要忘记覆盖isValidFragment(String fragmentName)方法,因为您的应用程序会被打败! ;)更严重的是我不知道为什么你需要这样做但是需要它。如果有人对此有解释,我很乐意阅读:)

    编辑:


    感谢kirtan403我现在知道为什么需要它:因为(android framework fragment injection)而必须设置它。


    正如您在onBuildHeaders(List<Header> target)中看到的,我们加载了另一个包含首选项的标题的xml文件。简而言之,标题是首选项的左侧部分,而片段是正确的部分(对于平板电脑)。对于手机,您将首先拥有标题,当您点击某个项目时,相应的片段将被放在标题列表的顶部。

    阅读本文(Multi-pane development in Android with Fragments - Tutorial)图片自行解释。


  • 然后是关联的xml资源

      

    headers_preference.xml (在项目的res / xml文件夹中)

    <?xml version="1.0" encoding="utf-8"?>
    
    <preference-headers
        xmlns:android="http://schemas.android.com/apk/res/android">
    
        <header 
            android:fragment="your.package.MyPreferenceFragment"
            android:title="Goto: Preference fragment"
            android:summary="An example of some preferences." />
    
    </preference-headers>
    

    您可能已在标题部分中注意到:

    android:fragment="your.package.MyPreferenceFragment"

    这将作为您要显示的片段的链接。在平板电脑上,它将加载在右侧部分和手机上,它将加载到当前视图的顶部。



3。 Android Manifest

现在您要做的是将您的活动添加到AndroidManifest.xml文件。

application部分内添加以下行:

<activity
    android:name="your.package.MyPreferenceActivity"
    android:label="Preferences">
</activity>

你可能会告诉我:

  

“亲爱的,你忘了把 android:launchMode =”singleTask“放在你的行动中”

但是不要把它,因为你永远不会把你的片段加载到手机上。这个错误是由一个伟人解决的!这是他的博客(Android header preferences on small screen/phone)的链接。



4。从菜单中启动首选项

最后你需要添加显示此偏好的功能!!要做到这一点,你需要做三件事:

  • 菜单

      

    menu.xml (在项目的文件夹res /菜单中)

    <?xml version="1.0" encoding="utf-8"?>
    
    <menu 
        xmlns:android="http://schemas.android.com/apk/res/android">
    
        <item 
            android:id="@+id/preferences"
            android:title="Preferences" />
    
    </menu>
    


  • 在方法onCreateOptionsMenu(Menu menu)

    下的主要活动(而非PreferenceActivity)中加载此菜单
    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu, menu);
        return true;
    }
    


  • 单击该按钮时启动MyPreferenceActivity活动。

    为此,您需要覆盖主要活动中的onOptionsItemSelected(MenuItem item)方法。

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        switch(item.getItemId())
        {
            case R.id.preferences:
            {
                Intent intent = new Intent();
                intent.setClassName(this, "your.package.MyPreferenceActivity");
                startActivity(intent);
                return true;
            }
        }
    
        return super.onOptionsItemSelected(item);
    }
    



Et voila les amis!

我还没有测试过这段代码。我把它从我自己的代码中修改了,所以我可能没有很好地复制粘贴的东西。如果你遇到错误告诉我,我会试着找出问题并解决这个问题。

我希望这篇文章可以帮助那些人:D

干杯!

答案 1 :(得分:19)

我喜欢这篇文章的解决方案:http://alvinalexander.com/android/android-tutorial-preferencescreen-preferenceactivity-preferencefragment

..因为对于那些只需要非常基本且快速运行的人来说,它似乎是最紧凑的。它只有一个.java文件和两个小的xml文件。

  

活动配置提醒

     

将3个文件添加到项目后,别忘了

     

A)将Prefs Activity添加到Manifest文件
   B)添加一些方法来启动Prefs Activity ..例如,按钮或菜单项

将以下文件添加到项目中。使用它们列出的顺序来避免编译错误。

  1. 添加/res/values/array.xml

    <resources>
        <string-array name="listArray">
            <item>Ace</item>
            <item>Club</item>
        </string-array>
    
        <string-array name="listValues">
            <item>Ace</item>
            <item>Club</item>
        </string-array>
    </resources>
    
  2. 添加/res/xml/preferences.xml

    <?xml version="1.0" encoding="utf-8"?>
    <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
        <EditTextPreference android:title="Your Name"
                            android:key="username"
                            android:summary="Please provide your username"></EditTextPreference>
        <CheckBoxPreference android:title="Application Updates"
                            android:defaultValue="false"
                            android:summary="This option if selected will allow the application to check for latest versions."
                            android:key="applicationUpdates" />
        <ListPreference     android:title="Download Details"
                            android:summary="Select the kind of data that you would like to download"
                            android:key="downloadType"
                            android:defaultValue="Ace"
                            android:entries="@array/listArray"
                            android:entryValues="@array/listValues" />
    </PreferenceScreen>
    
  3. 添加活动代码

    public class AppPreferenceActivity extends PreferenceActivity
    {
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit();
    
            checkValues();
        }
    
        public static class MyPreferenceFragment extends PreferenceFragment
        {
            @Override
            public void onCreate(final Bundle savedInstanceState)
            {
                super.onCreate(savedInstanceState);
                addPreferencesFromResource(R.xml.preferences);
            }
        }
    
        private void checkValues()
        {
            SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
            String strUserName = sharedPrefs.getString("username", "NA");
            boolean bAppUpdates = sharedPrefs.getBoolean("applicationUpdates",false);
            String downloadType = sharedPrefs.getString("downloadType","1");
    
            String msg = "Cur Values: ";
            msg += "\n userName = " + strUserName;
            msg += "\n bAppUpdates = " + bAppUpdates;
            msg += "\n downloadType = " + downloadType;
    
            Toaster.shortDebug(msg);
        }
    }