Jak utworzyć aktywność preferencji i fragment preferencji na Androidzie?
Ponieważ śledziłem Stary tutorial (Créez des applications pour Android - > openclassroom) utknąłem na tej przestarzałej metodzie addPreferencesFromResource(int id)
z klasy PreferenceActivity.
Więc moje pytanie brzmi:
Jaki jest nowy sposób tworzenia preferencji w Androidzie ?
2 answers
Znalazłem ten post (czego używać zamiast "addPreferencesFromResource"w preferencjach?), które pomagają mi zrozumieć, że musisz przejść przez PreferenceFragment
, aby to zrobić.
W poniższym wyjaśnieniu używam your.package.
tylko po to, aby pokazać, że musisz podać nazwę pakietu. Każdy ma swój własny pakiet, więc proszę zastąpić go swoim pakietem.
Zacznijmy:
1. Fragment Preferencji
-
Stwórz swój PreferenceFragment Klasa
MyPreferenceFragment
public class MyPreferenceFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.fragment_preference); } }
-
Następnie skojarzony zasób xml
fragment_preferencji.xml (w folderze res / xml twojego projektu)
<?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>
To wszystko dla
Fragment
części.
2. Aktywność Preferencji
-
Utwórz klasę 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); } }
Nie zapomnij obejść metodę
isValidFragment(String fragmentName)
, ponieważ aplikacja uderzy cię w twarz ! ;) Powazniej nie mam pojecia po co to robic ale to jest potrzebne. Jeśli ktoś ma jakieś wyjaśnienie na ten temat to chętnie przeczytam:) [22]}EDIT:
Dzięki kirtan403 już wiem dlaczego jest potrzebny : musi być ustawiony z powodu (fragmentu android framework wstrzyknięcie).
Jak widać w
onBuildHeaders(List<Header> target)
ładujemy kolejny plik xml, który zawiera nagłówki preferencji. Krótko mówiąc, nagłówki są lewą częścią preferencji, a fragment jest prawą częścią (dla tabletu). W przypadku telefonu najpierw będziesz miał nagłówki, a po kliknięciu na element odpowiedni fragment zostanie umieszczony na górze listy nagłówków.Przeczytaj ten artykuł ( tworzenie wielu okienek w Androidzie z fragmentami-Tutorial ) obrazy same się wyjaśniają.
-
Następnie skojarzony zasób xml
headers_preference.xml (w folderze res / xml twojego projektu)
<?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>
Jak zapewne zauważyłeś w sekcji nagłówek masz :
android:fragment="your.package.MyPreferenceFragment"
To będzie działać jako Link do fragmentu, który chcesz pokazać. Na tablecie ładuje się po prawej stronie, a na telefonie ładuje się na górze Widok bieżący.
3. Manifest Androida
Teraz powinieneś dodać swoją aktywność do pliku AndroidManifest.xml
.
W sekcji application
dodaj te linie:
<activity
android:name="your.package.MyPreferenceActivity"
android:label="Preferences">
</activity>
Pewnie mi powiesz:
"Oh darling you forgot to put android: launchMode= "singleTask" in your actvity "
Ale nie umieszczaj tego , ponieważ nigdy nie załadujesz swojego fragmentu na telefon. Ten błąd został rozwiązany przez wielkiego człowieka ! To jest link do jego bloga (Android header preferences on small screen / phone ).
4. Uruchom Preferencje z Menu
Na koniec musisz dodać możliwość pokazania tej preferencji !! Aby to zrobić, będziesz potrzebował 3 rzeczy:
-
Menu
menu.xml (w folderze res / menu Twojego projekt)
<?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>
-
Wczytywanie tego Menu w głównej aktywności (Nie PreferenceActivity) przy pomocy metody
onCreateOptionsMenu(Menu menu)
@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu, menu); return true; }
-
Rozpoczęcie aktywności
MyPreferenceActivity
Po kliknięciu tego przycisku.W tym celu musisz nadpisać metodę
onOptionsItemSelected(MenuItem item)
w swojej głównej aktywności.@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 !
I haven ' t przetestowałem ten kod. Wziąłem go i zmodyfikowałem go z własnego kodu, więc mogłem nie skopiować dobrze wklejonych rzeczy. Jeśli napotkasz błędy powiedz mi, postaram się rozwiązać problem i rozwiązać ten problem.
Mam nadzieję, że ten post pomoże niektórym ludziom tam :d
Zdrówko !Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:58
Spodobało mi się rozwiązanie z tego postu: http://alvinalexander.com/android/android-tutorial-preferencescreen-preferenceactivity-preferencefragment{[5]
.. ponieważ wydaje się najbardziej kompaktowy dla kogoś, kto po prostu potrzebuje czegoś bardzo podstawowego i szybko działa. Ma tylko jeden .plik java i dwa małe pliki xml.
Przypomnienia konfiguracji aktywności
Po dodaniu 3 plików do projektu, nie zapomnij
A) Dodaj Prefs Aktywność do pliku manifestu
B) dodaj jakiś sposób na uruchomienie aktywności Prefs .. np. przycisk lub element Menu
Dodaj następujące pliki do swojego projektu. Użyj kolejności, w jakiej są wymienione, aby uniknąć błędów kompilacji.
-
Dodaj/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>
-
Dodaj/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>
-
Dodaj kod aktywności
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); } }
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-10 19:05:31