Как вы создаете Preference Activity и Preference Fragment на Android?

Поскольку я следовал старому учебнику ( Crée des apps for Android -> openclassroom), я застрял на этом устаревшем методе addPreferencesFromResource(int id) из класса PreferenceActivity.

Итак, мой вопрос:

Каков новый способ создания настроек в Android?

2 ответа

Решение

Я нашел этот пост ( Что использовать вместо "addPreferencesFromResource" в PreferenceActivity?), Который помогает мне понять, что вы должны пройти через PreferenceFragment для того, чтобы сделать это.

В следующем объяснении я использую your.package. просто чтобы показать, что вы должны поставить имя пакета. У каждого своя упаковка, поэтому замените ее на свою.

давай начнем:


1. Фрагмент предпочтения

  • Создайте свой класс Preference Fragment

    MyPreferenceFragment

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


  • Тогда связанный ресурс XML

    фрагмент_префер.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).


    Как вы можете видеть в onBuildHeaders(List<Header> target) мы загружаем еще один XML-файл, который содержит заголовки предпочтения. Короче говоря, заголовки - это левая часть предпочтения, а фрагмент - правая часть (для планшета). Для телефона у вас сначала будут заголовки, и когда вы щелкнете по элементу, соответствующий фрагмент будет помещен поверх списка заголовков.

    Прочитайте эту статью ( Мультипанельная разработка в 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="your.package.MyPreferenceFragment"

    Это будет действовать как ссылка на фрагмент, который вы хотите показать. На планшете он будет загружаться в правой части, а на телефоне - поверх текущего представления.



3. Манифест Android

Теперь вам нужно добавить свою активность в AndroidManifest.xml файл.

Внутри application раздел добавить эти строки:

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

Вы, вероятно, скажете мне:

"О, дорогой, ты забыл поставить android:launchMode="singleTask" в своей деятельности"

Но НЕ ОСТАВЛЯЙТЕ ЭТО, так как вы никогда не загрузите свой фрагмент на телефон. Эта ошибка была решена великим человеком! Это ссылка на его блог ( настройки заголовка Android на маленьком экране / телефоне).



4. Запустите настройки из меню

Наконец, вам нужно добавить возможность показать это предпочтение! Для этого вам понадобятся 3 вещи:

  • Меню

    menu.xml (в папке res / menu вашего проекта)

    <?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>
    


  • Загрузка этого меню в вашей основной деятельности (не PreferenceActivity) по методу onCreateOptionsMenu(Menu menu)

    @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

Ура!

Мне понравилось решение из этого поста: http://alvinalexander.com/android/android-tutorial-preferencescreen-preferenceactivity-preferencefragment

... потому что он кажется самым компактным для тех, кому просто нужно что-то очень простое и быстро запускаемое. Он имеет только один файл.java и два небольших XML-файла.

Деятельность Config НАПОМИНАНИЯ

После добавления 3 файлов в ваш проект, не забудьте

A) Добавьте действие Prefs в файл манифеста
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);
        }
    }
    
Другие вопросы по тегам