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 ?

Author: WannaGetHigh, 2014-05-07

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 !
 91
Author: WannaGetHigh,
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.

  1. 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>
    
  2. 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>
    
  3. 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);
        }
    }
    
 17
Author: gnB,
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