it-swarm.com.ru

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

Когда я следовал старому учебнику ( Crée des Applications pour Android -> openclassroom ), я застрял в этом устаревшем методе addPreferencesFromResource(int id) из PreferenceActivity. учебный класс.

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

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

40
WannaGetHigh

Я нашел этот пост ( Что использовать вместо "addPreferencesFromResource" в 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

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

Ура!

101
WannaGetHigh

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

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

Конфигурация активности НАПОМИНАНИЯ

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

A) Добавьте действие Prefs в файл манифеста
B) Добавьте какой-нибудь способ запуска действия Prefs, например, кнопку или пункт меню.

Добавьте следующие файлы в ваш проект. Используйте порядок, в котором они перечислены, чтобы избежать ошибок компиляции.

  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);
        }
    }
    
19
Gene Bo