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

Поскольку я следил за старым учебником (Créez des applications for for Android → openclassroom) Я застрял в этом устаревшем методе addPreferencesFromResource(int id) от класс PreferenceActivity.

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

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

Ответ 1

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

    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), поскольку вы получите перфоманс в своем приложении!;) Более серьезно я понятия не имею, зачем вам это нужно, но это необходимо. Если у кого-то есть объяснение, я бы с радостью прочитал:)

    EDIT:


    Благодаря kirtan403 теперь я знаю, почему это необходимо: он должен быть установлен из-за (инъекции фреймворка андроида).


    Как вы можете видеть в 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 Manifest

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

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

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

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

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

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



4. Запустите Preferences из меню

Наконец, вам нужно добавить возможность показать это предпочтение!! Для этого вам понадобятся 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>
    


  • Загрузка этого меню в основное действие (а не в функцию предпочтения) по методу 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

Приветствия!

Ответ 2

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

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

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

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

A) Добавьте файл Prefs Activity to Manifest

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

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

  • Добавить/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);
        }
    }