128 votes

Comment faire pour ajouter barre d’actions de soutien bibliothèque dans PreferenceActivity ?

Barre d'Action de compatibilité a été ajouté dans la bibliothèque de prise en charge, de la révision de 18 ans. Il a maintenant ActionBarActivity de la classe pour créer des activités avec la Barre d'Action sur les anciennes versions d'Android.

Est-il possible d'ajouter de la Barre d'Action de soutien de la bibliothèque en PreferenceActivity?

Précédemment, j'ai utilisé ActionBarSherlock et il a SherlockPreferenceActivity.

128voto

Ľubomír Kučera Points 111

Eh bien, il semble que j'ai trouvé sans doute la meilleure solution qui devrait fonctionner même sur des API 7. Je l'ai testé sur l'API de 10, 19 et 21:

SettingsActivity.java:

...
import android.support.v7.widget.Toolbar;
...

public class SettingsActivity extends PreferenceActivity {

    private Toolbar mActionBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.xml.settings);

        mActionBar.setTitle(getTitle());
    }

    @Override
    public void setContentView(int layoutResID) {
        ViewGroup contentView = (ViewGroup) LayoutInflater.from(this).inflate(
                R.layout.settings_activity, new LinearLayout(this), false);

        mActionBar = (Toolbar) contentView.findViewById(R.id.action_bar);
        mActionBar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

        ViewGroup contentWrapper = (ViewGroup) contentView.findViewById(R.id.content_wrapper);
        LayoutInflater.from(this).inflate(layoutResID, contentWrapper, true);

        getWindow().setContentView(contentView);
    }
}

settings_activity.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.Toolbar
        android:id="@+id/action_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minHeight="?attr/actionBarSize" />

    <FrameLayout
        android:id="@+id/content_wrapper"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

</LinearLayout>

styles.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="Theme.Application" parent="@style/Theme.AppCompat" />

    <style name="Theme.Settings" parent="@style/Theme.Application">
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowActionBar">false</item>

        <item name="toolbarStyle">@style/Widget.Toolbar</item>
    </style>

    <style name="Widget.Toolbar" parent="@style/Widget.AppCompat.Toolbar">
        <item name="android:background">?attr/colorPrimary</item>
        <item name="android:navigationIcon">?attr/homeAsUpIndicator</item>
        <item name="navigationIcon">?attr/homeAsUpIndicator</item>
    </style>

</resources>

Définissez ensuite votre demande de thème de Thème de.Applications et vos paramètres de l'activité thème de Thème de.Les paramètres.

Il utilise android.de soutien.v7.widget de.Barre d'outils qui a été ajouté dans appcompat-v7 21.0.0 et il n'a pas besoin de l'original de préférences de mise en page ou d'un 3ème partie les bibliothèques.

Trouver plus ici: SettingsActivity.java

78voto

Chris Banes Points 3013

Il n’y a actuellement aucun moyen d’atteindre avec AppCompat. J’ai ouvert un bug dans leur propre pays.

12voto

Konstantin Points 2070

Vous avez trouvé une implémentation PreferenceFragment basée sur le fragment support-v4:

https://github.com/kolavar/android-support-v4-preferencefragment

Edit: Je viens de le tester et son fonctionnement est génial!

3voto

Maxwell Weru Points 121

Intégrer PreferenceActivity avec ABC n'est pas possible, au moins pour moi. J'ai essayé les deux possibilités que j'ai pu trouver, mais aucune n'a fonctionné:

Option 1:

ActionBarPreferenceActivity s'étend PreferenceActivity. Lorsque vous faites cela, vous obtenez restreint par l' ActionBarActivityDelegate.createDelegate(ActionBarActivity activity). Vous devez aussi mettre en oeuvre ActionBar.Callbacks ce qui n'est pas accessible

Option 2:

ActionBarPreferenceActivity s'étend ActionBarActivity. Cette approche nécessite la réécriture d'un tout nouveau PreferenceActivity, PreferenceManager et peuvent être PreferenceFragment ce qui signifie que vous besoin de l'accès à l'caché des classes comme l' com.android.internal.util.XmlUtils La solution ne peut venir que de Google devs mise en œuvre d'un ActionBarWrapper qui peut être ajouté à n'importe quelle activité.

Si vous avez vraiment besoin d'une activité de préférence, à mon avis pour l'instant est - ActionBarSherlock.

Cependant, j'ai réussi à le mettre en œuvre ici.

3voto

Sufian Points 1380

J'ai trouvé un beaucoup plus propre façon de le faire dans les Docs Android:

android:parentActivityName

Le nom de la classe de la logique parent de l' de l'activité. Le nom doit correspondre au nom de la classe donnée à l' correspondant de l'élément android:nom de l'attribut.

Le système lit cet attribut pour déterminer l'activité qui devrait être commencé lors de l'utilisation appuie sur le bouton dans la barre d'action. L' le système peut également utiliser cette information pour synthétiser une pile de retour de activités avec TaskStackBuilder.

À l'appui de l'API niveaux de 4 - 16, vous pouvez également déclarer l'activité parent avec un élément qui spécifie une valeur pour "android.de soutien.PARENT_ACTIVITY". Par exemple:

<activity
    android:name="com.example.app.ChildActivity"
    android:label="@string/title_child_activity"
    android:parentActivityName="com.example.myfirstapp.MainActivity" >
    <!-- Parent activity meta-data to support API level 4+ -->
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.example.app.MainActivity" />
</activity>

Dans votre onOptionsItemSelected(), vous pouvez gérer ce qui se passe quand un bouton de retour est pressé. La clé, c'est, c'est recommandé par Android. :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X