Ответ 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
Приветствия!