Как программно добавить EditTextPreferences в мой PreferenceFragment?
Я новичок в Android, поэтому мне нужно небольшое руководство о том, как программно добавлять объекты EditTextPreference в мой PreferenceFragment.
Я вытягиваю список значений из веб-службы. Я успешно сохранил их в своих SharedPreferences и использую их для генерации URL (часть пути).
Мне бы хотелось, чтобы пользователи моего приложения могли редактировать эти значения, но после большого поиска в Google мне не ясно, как программно добавить объекты EditTextPreference в мой PreferenceFragment.
Обратите внимание, что мой PreferenceFragment работает нормально для значений SharedPreferences, которые я жестко кодирую как имена в XML-файл настроек (PreferenceScreen). Я также знаю, как получить мои SharedPreferences, так что не беспокойтесь о необходимости объяснить мне эту часть.
Я использую addPreferencesFromResource в onCreate моего PreferenceFragment. Должен ли я добавить их в onCreateView? Я думал, что смогу получить PreferenceCategory и добавить их туда? Но опять же, я не уверен, как это сделать. Буду очень признателен за помощь!
// Код
PrefsFragment.java:
package com.example.lorddoineedhelp;
import android.os.Bundle;
import android.preference.PreferenceFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class PrefsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = super.onCreateView(inflater, container, savedInstanceState);
// I am guessing I need to do something here?
return v;
}
}
XML-файл для PreferenceFragment:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Hard coded values -->
<PreferenceCategory
android:title="General">
<CheckBoxPreference
android:key="debug"
android:title="Debug"
android:summary="Enable Debug" />
</PreferenceCategory>
<PreferenceCategory android:title="Address">
<EditTextPreference
android:key="ipAddress"
android:title="IP Address"
android:summary="IP Address used for Image pings"
/>
<EditTextPreference
android:key="port"
android:title="Port"
android:summary="Port used for Image pings" />
</PreferenceCategory>
<!-- Where I want to add the values from my web service -->
<PreferenceCategory
android:title="Paths"
android:key="urlPaths">
</PreferenceCategory>
</PreferenceScreen>
3 ответа
Вы можете добавить настройки, например, EditTextPreference, CheckBox и т. Д., Программно в методе "onCreate" PreferenceFragment.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load "dummy" (empty) preferences from an XML resource
addPreferencesFromResource(R.xml.preferences_channelconfig);
PreferenceScreen screen = this.getPreferenceScreen(); // "null". See onViewCreated.
// Create the Preferences Manually - so that the key can be set programatically.
PreferenceCategory category = new PreferenceCategory(screen.getContext());
category.setTitle("Channel Configuration");
screen.addPreference(category);
CheckBoxPreference checkBoxPref = new CheckBoxPreference(screen.getContext());
checkBoxPref.setKey(channelConfig.getName() + "_ENABLED");
checkBoxPref.setTitle(channelConfig.getShortname() + "Enabled");
checkBoxPref.setSummary(channelConfig.getDescription());
checkBoxPref.setChecked(channelConfig.isEnabled());
category.addPreference(checkBoxPref);
}
Важным шагом является addPreferencesFromResource(...)
, с фиктивным XML, чтобы прикрепить пустой PreferenceScreen к фрагменту. Без этого не существует "предпочтения верхнего уровня, являющегося корнем иерархии предпочтений", таким образом, this.getPreferenceScreen()
возвращает Null
XML, который я использовал, был просто:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:orderingFromXml="true">
</PreferenceScreen>
Надеюсь, что это помогает кому-то.
Вот код для программного создания PreferenceFragment:
public class MyPreferenceFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(getActivity());
setPreferenceScreen(screen);
EditTextPreference preference = new EditTextPreference(screen.getContext());
preference.setKey("EditTextPreference");
preference.setTitle("Edit Text Preference");
preference.setSummary("Click the preference to edit text.");
screen.addPreference(preference);
}
}
Я не знаю, работает ли он в методе onCreateView, но он работает в onViewCreated. Вот мой код (внутри подкласса PreferenceFragment):
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
this.getPreferenceScreen().addPreference(new EditTextPreference(getActivity()));
}