Как вы создаете 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, например, кнопку или пункт меню.
Добавьте следующие файлы в ваш проект. Используйте порядок, в котором они перечислены, чтобы избежать ошибок компиляции.
Добавить /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); } }