提问者:小点点

如何在Android上创建偏好活动和偏好片段?


当我遵循旧教程(Créez des应用程序倒Android-

所以我的问题是:

在Android中创建首选项的新方法是什么?


共2个答案

匿名用户

我发现了这篇文章(在首选项活动中使用什么代替“addPrecentcesFromResource”?),它帮助我理解你必须通过首选项片段才能做到这一点。

在下面的解释中,我使用your. pack。只是为了表明您必须输入包名。每个人都有自己的包,所以请将其替换为您的包。

让我们开始:

>

  • 创建您的首选项片段类

    我的偏好片段

    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部分的全部内容。


    >

  • 创建首选项活动类

    我的首选项活动

    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 framentName)方法,因为你会被你的应用程序打脸!;)更严重的是,我不知道你为什么需要这样做,但它是需要的。如果有人对此有解释,我很乐意阅读:)

    多亏了kirtan403,我现在知道为什么需要它:它必须设置,因为(android框架片段注入)。

    正如您在onBuildHeaders(列表

    阅读本文(使用Fragments在Android中进行多窗格开发-教程)图像自行解释。


    >

  • 然后关联的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="你的。包。我的偏好片段"

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


    现在您应该做的是将您的Activity添加到AndroidManifest. xml文件中。

    application部分中添加以下行:

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

    你大概会告诉我:

    “哦,亲爱的,你忘了在你的行为中放入android: LaunchMode="singleTask"”

    但是不要把这个放在手机上,因为你永远不会在手机上加载你的片段。这个错误是由一个伟大的人解决的!这是他博客的链接(小屏幕/手机上的Android标题首选项)。


    最后,您需要添加显示此偏好的功能!!为此,您需要3件事:

    >

  • 菜单

    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(菜单菜单)方法下将此菜单加载到您的主活动(而不是首选项活动)中

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu, menu);
        return true;
    }
    


    >

  • 单击该按钮时启动MyPrecentceActivityActivity。

    为此,您需要覆盖Main活动中的onOptionsItemS选择(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);
    }
    


    朋友们来了!

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

    我希望这篇文章能帮助一些人: D

    干杯!

  • 匿名用户

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

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

    活动配置提醒

    将3个文件添加到您的项目后,不要忘记

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

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

    >

  • 添加 /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>
    

    添加 /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>
    

    添加活动代码

    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);
        }
    }